【问题标题】:How to store DateTimeOffset in PostreSQL如何在 PostgreSQL 中存储 DateTimeOffset
【发布时间】:2015-03-18 16:13:04
【问题描述】:

我在使用 Entity Framework 从 PostgreSQL 数据库中检索 DateTimeOffset 时遇到问题。就问题研究而言,我发现this article 可以帮助我了解问题所在,但我不知道如何解决。

我有一个 API,允许用户上传文件(主要是图像),它会提取图像的拍摄日期并将其存储在数据库中。它大部分时间都很好用。但是,如果日期在 2007 年之前的 3 月 11 日到 4 月的某个时间(日期因年份而异)之间,它会很好地保存到数据库中,但是在尝试检索该行时,它会引发错误:

本地 dateTime 参数的 UTC 偏移量与偏移量参数不匹配。

我在 postgreSQL 中使用 Timestamp With Time Zone 类型作为 CameraDate 字段。我不知道如何让它正常工作。如果有办法在不更改数据库的情况下做到这一点,那就更好了。

例子:

2001-04-01 10:47:17-06 Works
2001-03-01 10:47:17-06 Works
2001-03-13 10:47:17-06 Doesn't work
2007-03-13 10:47:17-06 Works

这是我的代码:

Context.Files.Add(file);
Context.Entry(file).Reload();

文件类看起来像这样(为简洁起见,删除了一些字段):

public class File
{
    [Column("FileId")]
    public override Guid ID { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int DisplayId { get; set; }
    public DateTimeOffset? CameraDate { get; set; }
}

【问题讨论】:

  • 你能发布你的代码吗?
  • 看起来 PostgreSQL 仅在内部存储 UTC 时间戳。 postgresql.org/docs/9.1/static/datatype-datetime.html
  • 我可以发布代码,但我认为这不会有太大帮助。基本上我只是在做一个 Context.Files.Add(file) 然后 Context.Entry(file).Reload()。在 Reload() 上抛出错误。我正在使用 Reload,因为我有一个需要更新的序列字段。
  • 对于DateTimeOffset,您应该在postgres 中使用timestamp with time zone 类型。但是由于您没有发布任何代码,我所能做的就是评论并投票关闭。
  • 感谢您的编辑,我删除了我的近距离投票。你能告诉我们CameraDate字段在你的postgres数据库中是什么数据类型吗?

标签: c# entity-framework postgresql datetimeoffset


【解决方案1】:

好的,这似乎是 npgsql 或 npgsql.EntityFramework 中 DateTimeOffset 的错误。似乎记录了in their issue tracker 的其他几个问题。特别是 issue #542 非常接近 - 但有不同的异常消息。

我建议你在那里创建一个新问题,因为它们最能帮助进一步诊断。

【讨论】:

  • 看起来 Pgsql 的开发人员目前建议不要使用 DateTimeOffsettimestamp with time zone。请参阅以 comment 开头的讨论
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多