我原以为在.NET中,DateTime.FromOADate和在MS SQL中的casting to a DateTime的工作方式相同。然而,当给定值: 41640时,DateTime.FromOADate(value)返回:2014-01-01,而CAST(value AS DATETIME)返回:2014-01-03。这是因为起始日期不同导致的预期行为,还是有什么问题?
这是2014年1月的第三天在T-SQL中:
SELECT CAST(41640 AS DATETIME)
这是2014年1月的第一天在.NET中:
DateTime dt = DateTime.FromOADate(41640)
CAST
。 "零"日期是1900年1月1日。 DateTime.FromOADate
基准日期是1899年12月30日的午夜。所以,01/01/1900
和12/30/1899
之间相差两天。print CAST(0 AS DATETIME)
将输出:在C# .Net中,Jan 1 1900 12:00AM
Console.WriteLine(DateTime.FromOADate(0));
将输出:因此,您可以看到两个基准日期之间相差2天。这就是为什么您会遇到这样的问题。12/30/1899 12:00:00 AM
date
,datetime
或datetime2
类型,并将其转换为DateTime
在您的.NET代码中。DateTime dt = (DateTime) myDataReader["FooDateTime"];
12/30/1899
或12/31/1899
的纪元,这取决于使用它的程序。SQL Server使用固定的纪元1/1/1900
。DateTime
中,除非您关注.Kind
属性。)SQL服务器的基准日期为“19000101”; 尝试转换为 CASTing 0。
根据此文档:http://msdn.microsoft.com/en-us/library/system.datetime.fromoadate.aspx FromOADate从1899-12-30开始