Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DateTime.FromOADate与MSSQL转换为DateTime_C#_.net_Sql_Sql Server_Datetime - Fatal编程技术网

C# DateTime.FromOADate与MSSQL转换为DateTime

C# DateTime.FromOADate与MSSQL转换为DateTime,c#,.net,sql,sql-server,datetime,C#,.net,Sql,Sql Server,Datetime,我假设.NET中的DateTime.FromOADate和MS SQL中的转换为DateTime的工作方式相同 但是,给定值:41640 DateTime.FromOADate(值)返回:2014-01-01 CAST(值为DATETIME)返回:2014-01-03 这是由于不同的开始日期造成的预期行为,还是有些不正确?这是T-SQL 2014年1月的第三天: SELECT CAST(41640 AS DATETIME) 这是.NET中2014年1月的第一天: DateTime dt =

我假设.NET中的DateTime.FromOADate和MS SQL中的转换为DateTime的工作方式相同

但是,给定41640
DateTime.FromOADate(值)返回:2014-01-01
CAST(值为DATETIME)返回:2014-01-03


这是由于不同的开始日期造成的预期行为,还是有些不正确?

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

SELECT CAST(41640 AS DATETIME)  
这是.NET中2014年1月的第一天:

DateTime dt = DateTime.FromOADate(41640)
原因记录在MSDN中:

“零”日期为1900-01-01

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


因此
01/01/1900
12/30/1899

SQL Server的基准日期是“19000101”,两者之间有两天的差异;尝试铸造0

据此:
FromOADate开始于1899-12-30

要调查这一点,您必须首先查看基准日期

在MSSQL
print CAST中(0作为日期时间)
将输出:

1900年1月1日凌晨12:00

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

1899年12月30日12:00:00上午

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

OLE自动化日期(也称为“OADates”)是为了与COM接口兼容,并用于通过VBA与Microsoft Excel之类的东西进行通信。您不应该在与SQL Server通信时使用它们。只需在查询中键入本机SQL
date
datetime
datetime2
并将其转换为.NET代码中的
datetime

DateTime dt = (DateTime) myDataReader["FooDateTime"];
正如其他人提到的,SQL Server时代与OLE自动化时代不同。OLE自动化日期也有一些带有负值的奇怪行为,而且1900年3月1日之前的日期可能使用
12/30/1899
12/31/1899
,这取决于使用它的程序。SQL Server使用固定的纪元
1/1/1900


和许多Windows和.NET类型一样,epoch不是固定为UTC的,因此您必须知道上下文时区信息也在起作用。(尽管这也发生在
DateTime
中,除非您注意
.Kind
属性。)

感谢您首先来到这里;我得到了确切的答案。一样。号码。