为什么Datediff函数显示不同的值?

Sai*_*een 23 sql sql-server

当我执行以下查询时,我得到不同的结果.

SELECT Datediff(year, 0, Getdate());
Run Code Online (Sandbox Code Playgroud)

结果是115

当我使用它时,我得到另一个结果:

SELECT Datediff(year, 1900, Getdate());
Run Code Online (Sandbox Code Playgroud)

结果是110

实际上在SQL Server中它将采取1900-01-01,但为什么这些显示不同的值?

SAS*_*SAS 23

试试这个解释逻辑:

select cast(0 as datetime)
select cast(1 as datetime)
Run Code Online (Sandbox Code Playgroud)

整数被解释为自1900-01-01以来的天数,而字符串值(如'1900')将被解释为日期格式.

从1900年1月1日起的1900天是1905-03-16,这是从1900年起的5年和从现在起的110年(2015年).


shr*_*t18 15

这是因为如果您将0转换为日期时间,则返回1900作为年份部分,而1900转换为datetime则返回1905作为年份部分.

演示

来自MSDN:

具有datetime数据类型的值由Microsoft SQL Server在内部存储为两个4字节整数.前4个字节存储基准日期(1900年1月1日)之前或之后的天数.基准日期是系统参考日期.

这意味着,将文字0转换datetime为等效于在1/1/1900(即1/1/1900)之后获取0天的日期时间值.同样地,对于1900年.因此,正如@MartinSmith在评论中指出的那样,您的计算等同于SELECT Datediff(year,dateadd(d,0,'1/1/1900'), Getdate())按预期返回115.

也许值得注意的是,在演员和转换MSDN网页未明确涵盖这种情况下即intdatetime.

  • 缺少将int转换为datetime的解释有效地与`DATEADD(DAY`到`1900-01-01`)相同 (4认同)
  • 对,但不好的解释.1900(不含引号)表示自1900-01-01以来*1900天*. (4认同)