我有一个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,所以我认为同样适用。
答案 0 :(得分:2)
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类型,则必须将日期时间参数转换为客户端上的正确时区。数据库字段之间的比较不需要任何转换,因为它们转换为的SQL不依赖于时区。
如果您想支持不同的时区,则必须切换到DateTimeOffset类型。
当然,您可以假设所有数据共享相同的时区并忽略任何差异,在这种情况下,DateTime就足够了。