SQL Server 2012中的日期转换问题

dre*_*mer 3 sql-server datetime date sql-server-2012

我正在尝试将数值转换为日期.我在下面的答案找到了它

SELECT CONVERT(DATETIME, CONVERT(FLOAT, 41547))
Run Code Online (Sandbox Code Playgroud)

我得到的输出是2013-10-02 00:00:00.000

但是如果我在excel中检查41547的日期值它给了我2013-09-30,这比我在SQL Server中得到的少了2天.

请帮我理解这种转换.
我如何获得2013-09-30而不是2013-10-0241547.

Aru*_*mar 6

Excel将神秘日期01/00/1900(即12/31/1899)视为对应于0,并错误地将1900年视为闰年.因此,对于03/01/1900之前的日期,Excel编号实际上是18/31/1899之后的天数.

Excel不会格式化任何低于0的数字(-1给你##########),所以这只对"01/00/1900"到02/28/1900很重要,因此更容易使用以12/30/1899日期为基础.

参考这篇 文章

因此,在您的SQL Server中,您需要添加12/30/1899中的天数(在您的情况下41547 ),如下所示,它将提供与excel返回相同的结果.

SELECT DATEADD(DAY, 41547, '1899-12-30')  
Run Code Online (Sandbox Code Playgroud)

这将导致2013-09-30 00:00:00.000

如果您不希望结果中的时间戳与excel 2013-09-30中的格式相同,那么请使用convert as

SELECT REPLACE(CONVERT(VARCHAR(10), DATEADD(DAY ,41547, '1899-12-30'), 111), '/', '-')
Run Code Online (Sandbox Code Playgroud)