1

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

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.Date就不必在i.DateInactive.Value.ToLocalTime.Date任何地方都进行转换?

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

4

1 回答 1

2

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

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

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

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

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

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

如果要支持不同的时区,则必须切换到 DateTimeOffset 类型。

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

于 2013-07-04T10:18:00.383 回答