DateTime.FromOADate vs MSSQL Cast as DateTime

时间:2013-09-23 13:44:21

标签: c# .net sql sql-server datetime

我认为.NET中的 DateTime.FromOADate 在MS SQL中投射到DateTime 的工作方式相同。

但是,鉴于 41640
DateTime.FromOADate (值)返回: 2014-01-01
CAST (值 AS DATETIME )返回: 2014-01-03

由于起始日期不同,这是预期的行为吗?或者是不对的?

4 个答案:

答案 0 :(得分:2)

这是2014年1月在T-SQL中的第三天

SELECT CAST(41640 AS DATETIME)  

这是2014年1月在.NET中的第一天

DateTime dt = DateTime.FromOADate(41640)

原因记录在MSDN中:

CAST

“零”日期 1900-01-01

DateTime.FromOADate

基准日期,午夜, 1899年12月30日

因此01/01/190012/30/1899之间存在两天的差异。

答案 1 :(得分:1)

要调查此问题,您必须先查看基准日期,

在MSSQL中print CAST(0 AS DATETIME)将输出:

  

1900年1月1日12:00 AM

在C#.Net Console.WriteLine(DateTime.FromOADate(0));中输出:

  

12/30/1899 12:00:00 AM

因此,您可以看到2个基准日期之间有 2天差异。这就是你面临这样问题的原因。

答案 2 :(得分:1)

OLE自动化日期(又名“OADates”)用于与COM接口兼容,并用于通过VBA与Microsoft Excel等通信。您不应该在与SQL Server通信时使用它们。只需在查询中返回原始SQL datedatetimedatetime2类型,然后将其转换为.NET代码中的DateTime

DateTime dt = (DateTime) myDataReader["FooDateTime"];

正如其他人所提到的,SQL Server纪元与OLE自动化时代不同。 OLE自动化日期也有一些带负值的奇怪行为,并且在1900年3月1日之前的日期可能使用12/30/189912/31/1899的时期,具体取决于使用它的程序。 SQL Server使用固定时期1/1/1900

与许多Windows和.NET类型一样,时代不固定为UTC,因此您还必须知道正在播放的上下文时区信息。 (虽然这种情况也会发生在DateTime,除非您注意.Kind属性。)

答案 3 :(得分:0)

SQL Server的基准日期是'19000101';尝试CASTing 0。

据此:http://msdn.microsoft.com/en-us/library/system.datetime.fromoadate.aspx FromOADate从1899-12-30开始