当我执行以下查询时,我得到不同的结果.
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网页未明确涵盖这种情况下即int到datetime.
| 归档时间: |
|
| 查看次数: |
1163 次 |
| 最近记录: |