使用哪种SQL Server sql数据类型以保留UTC日期时间

zam*_*6ak 7 c# sql-server datetime utc entity-framework-4

我有一个SQL Server数据库表,其中"ReceivedDate"列定义为"datetime",应该包含UTC日期......在我的C#代码中,我使用Entity Framework将表映射到一个类,该类具有相应的属性"ReceivedDate" "System.DateTime类型.

程序将日期从XML文件加载到DB中,稍后检查XML中的数据是否与DB中的数据相同...当XML和DB中的ReceivedDate的日期不匹配时,检查失败...例:

ReceivedDate from XML:
<ReceivedDate>2010-12-16T22:53:27.5912217Z</ReceivedDate>

ReceivedDate from DB:
2010-12-16 22:53:27.590
Run Code Online (Sandbox Code Playgroud)

经过一些调试后,我注意到DB中的日期没有将Kind属性设置为Utc,并且ticks的数量要少得多,因此日期比较失败......

  • 如何在SQL服务器中存储完整的UTC日期,以便当Entity Framework检索它时,我得到的System.DateTime值与XML文件中的值完全相同(包括Kind = Utc)?
  • 这只是为我的列使用不同的sql数据类型的问题(例如datetime2而不是datetime)?

更新:

我解决这个问题的方法是:

  1. 将sql数据类型更改为"datetime2"以匹配sql数据类型和.net System.DateTime之间的精度
  2. 在我的POCO中,我覆盖了Equals,当检查ReceivedDate属性时,我刚从ReceivedDate创建了另一个DateTime变量,但是使用了Kind == Utc的构造函数.

这是有效的,虽然我同意使用DateTimeOffset可能是更好的解决方案.

Ode*_*ded 7

使用datetimeoffset存储在SQL Server上.

定义一个日期,该日期与具有时区感知且基于24小时制的一天的时间相结合.

另外,请考虑使用DateTimeOffset结构而不是DateTime.NET代码.


GvS*_*GvS 1

datetimeSql服务器的精度只有百分之三秒

.Net 中的准确率更高。因此,数据库数据是四舍五入的,并且不相同。如果你查看你的数据,错误是 0.0012217 秒。

如果可能的话,您可以使用datetime2

0~7位,精度100ns。默认精度为 7 位。

datetime2使用与 .Net 相同的精度DateTime