【问题标题】:pass UTC dates in query via Dapper通过 Dapper 在查询中传递 UTC 日期
【发布时间】:2020-07-21 01:22:02
【问题描述】:

我在这里为自己(如果没有其他人)发布答案,因为我从未发现它在 SO 的其他地方明显列出。为此浪费了几个小时。

我想通过以下方式使用 Dapper:

await dapper.Connection().QueryAsync<T>(insertSQL, obj);

insertSQL 可以是例如将日期字段添加到表记录中的插入语句。 obj 对象将这些字段的值作为参数提供。

如果日期需要是 UTC 类型,问题就开始了。数据库字段是 timestamptz,所以没关系。但是如何说服 Dapper 发送支持 UTC 的 SQL 呢?

这个问题我纠结了好久。

【问题讨论】:

  • 您应该发布一个问题(即我有这个问题,这是我尝试过的,我该如何解决?)然后作为实际答案,发布您的解决方案。一个问题不能既是问题又是答案。
  • 解决了两个 cmets--thx
  • 问:PostgreSQL 数据库中列的数据类型是什么?

标签: c# postgresql dapper utc


【解决方案1】:

什么对我有用:使用“DateTimeOffset”,而不是“DateTime”C# 类型。

当您使用 DateTime 时,您可以做一些事情(DateTimeKind 等),但它们无助于 Dapper 向(在我的情况下)PostgreSQL 发送正确制定的​​语句。您可能会开始认为 Dapper 不能/不会帮助您。

但是,如果您的 C# 对象以 DateTimeOffset 格式存储日期,Dapper 会很好地帮助您。因此,在您的课程中,当您考虑 UTC 风格时,请避免使用 DateTime 属性类型。

这可能有点太模糊了,但如果他们问的问题和我今天问的一样的话,也许这足以让像我这样的下一个人走上一条好路。

PS -- 既然我了解了 DateTimeOffset 与 DateTime,那么 Dapper 失败的原因就很明显了。它从 C# 对象作为 DateTime(无时区信息)吸入的内容转换为 PostgreSQL“DateTimeOffset”(读取,timestamptz)。它注定要失败。但是,在您的 C# 对象中存储一个 DateTimeOffset,当 Dapper 为数据库提供带有时区的日期时间时,Dapper 将很乐意提供所有详细信息,包括日期、时间和以小时为单位的相关偏移量。

【讨论】:

  • 请运行col_description(table_oid, column_number)(或等效项)并告诉我们“DateTimeOffset”被翻译成什么PostgreSQL数据类型。
  • 仍在等待回复。另外:请务必“接受”您的回答。
  • 由于几个原因推迟了。首先是因为你让我感到困惑。我指定了 postgreSQL 表的字段类型。不知道你为什么要我验证 DateTimeOffset 被翻译成什么。它被放入 timestamptz 字段中。 ??我错过了什么?无论如何,我希望很快就会在这方面做进一步的工作,但这是第二个原因......我被其他任务耽误了。
  • 问:你有什么困惑? DateTimeDateTimeOffset 是 .Net 数据类型。实体框架(或 Dapper-我不知道它如何或是否与 EF 相关)将 .Net 类型映射到底层 DB 类型。 PostgreSQL 数据库类型为:postgresql.org/docs/current/datatype-datetime.html。我很好奇映射是什么:时间、时间戳、时间戳、间隔或“其他”。请“接受”你的回答。
  • 您获得了 90k+ 分,这是您第二次告诉我接受我自己的答案,但我仍然无法再做 24 小时。此外,您要我问 Postgres 什么是列类型,即我自己创建的表的列。我告诉过你我把它做成了时间戳记。你认为让 Postgres 给我我自己定义的列的数据类型......会告诉你一些关于 Dapper 的事情,一个没有创建表的轻量级 ORM。您的孩子是否入侵了您的帐户?这真的是保罗吗?还是我吸毒而我不知道?敬请期待……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-15
  • 1970-01-01
  • 2023-03-11
  • 2018-11-23
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多