【问题标题】:LINQ to SQL Data Context - Date Properties - Change DateTImeKind Unspecified Dates to Local DatesLINQ to SQL 数据上下文 - 日期属性 - 将 DateTImeKind 未指定日期更改为本地日期
【发布时间】:2013-07-04 10:04:47
【问题描述】:

我有一个 LINQ to SQL 数据上下文,其中包含一个具有两个日期属性的类:

DateActive DateTime NOT NULL
DateInactive DateTime NULL

MSDN 明确指出:

LessThanOrEqual 运算符通过比较两个 DateTime 值的刻度数来确定它们之间的关系。在比较 DateTime 对象之前,请确保对象代表同一时区的时间。您可以通过比较它们的 Kind 属性的值来做到这一点。

http://msdn.microsoft.com/en-us/library/system.datetime.op_lessthanorequal.aspx

但在我的 LINQ 查询中,上述两个字段显示为 DateTimeKind.Unspecified,我正在与 Date.Today 进行比较,即 DateTimeKind.Local

有没有一种很好的方法可以在整个应用程序中将上述属性指定为DateTimeKind.Local,这样我就不必像i.DateActive.ToLocalTime.Datei.DateInactive.Value.ToLocalTime.Date 那样到处转换?

我使用的是 .NET 4 而不是 .NET 4.5,所以我假设同样适用。

【问题讨论】:

  • 为什么要更改数据库值的 DateTimeKind?
  • 按照 MSDN 的说法...我想要在我的应用程序中明确指出来自数据库的日期是本地日期时间而不是 UTC 日期时间。
  • 两者都不是 - 他们没有时区。实际上,如果您始终将它们视为本地,则无需进行任何转换

标签: .net linq linq-to-sql .net-4.0 datacontext


【解决方案1】:

MSDN 文章讨论了比较客户端日期。 Linq To SQL 将您的语句转换为 SQL,其中不使用 DateTimeKind 属性。

您应该使用 DateTimeOffset 而不是 DateTime。这将允许您use DateTimeOffset methods in SQL 并利用 SQL Server 中的 DATETIMEOFFSET 类型。

LINQ to SQL 生成 SQL 语句。 System.DateTime 和 SQL Server 的 DATETIME 类型没有时区信息,因此尝试考虑时区是没有意义的。这两个值都不包含任何时区,那么如何进行任何自动转换?

您问题中的两个 DateTime 值来自两个不同的来源。 DateTime.Today 来自您的本地计算机,其中时区是已知的,所以它是 DateTimeKind.Local

虽然数据库列来自数据库,但来自不包含时区信息的数据类型。 DateTimeKind.Unspecified 是这里的正确值。顺便说一句,您在存储到数据库时假设什么时区?世界标准时间?你当地的时区?夏季还是冬季?

如果您想继续使用 DateTime 类型,则必须将您的 datetime 参数转换为客户端上的正确时区。数据库字段之间的比较不需要任何转换,因为它们转换为的 SQL 不依赖于时区。

如果你想支持不同的时区,你将不得不切换到 DateTimeOffset 类型。

当然,您可以假设所有数据共享同一时区并忽略任何差异,在这种情况下 DateTime 就足够了。

【讨论】:

  • 我认为我不需要使用 DateTimeOffset,我的应用程序仅适用于 GMT / BST。我只是按照 MSDN 关于 Date 类型的运算符的说法。并希望始终使用当地时间。
  • 感谢您为 Date 类型以及 LINQ 和 SQL DateTime 处理带来了一些清晰,我知道您说这无关紧要,因为 LINQ 将其转换为与时区无关的 SQL。但是,在我的应用程序中的某个时刻,我会在应用程序中比较它们,而不是在 SQL Server 中。
猜你喜欢
  • 2018-11-23
  • 1970-01-01
  • 2013-10-24
  • 2020-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多