SQLDateDiff函数
我正在使用SSMS 2014处理SQL serverSQLDateDiff函数,sql,sql-server,ssms-2014,Sql,Sql Server,Ssms 2014,我正在使用SSMS 2014处理SQL server select DATEDIFF(MM, 0, GETDATE()) 输出为1409(2017年6月16日运行) 我很困惑,因为DATEDIFF语法的第二个和第三个参数应该是有效的日期,但这里的第二个参数为0时,如何以及为什么执行此查询并给出结果 我检查了ISDATE(0)和ISDATE('0'),它给出了语法错误,因此如果0不是有效日期,那么为什么DATEDIFF会接受它并给出结果。文档指定: 起始日期 可以解析为时间、日期、smallda
select DATEDIFF(MM, 0, GETDATE())
输出为1409(2017年6月16日运行)
我很困惑,因为DATEDIFF语法的第二个和第三个参数应该是有效的日期,但这里的第二个参数为0时,如何以及为什么执行此查询并给出结果
我检查了ISDATE(0)和ISDATE('0'),它给出了语法错误,因此如果0不是有效日期,那么为什么DATEDIFF会接受它并给出结果。文档指定: 起始日期 可以解析为时间、日期、smalldatetime、, datetime、datetime2或datetimeoffset值 虽然有细微的区别,“可以解决”与“是类型”并不相同 因此,整数被解释为自“1899-12-31”以来的天数。但是,字符串不会被解释为天,即使它们看起来像一个数字
ISDATE()
接受一个字符串参数,因此它正在将0
转换为'0'
。而且'0'
不是日期格式。实际上,datediff()
将失败,第二个参数将作为'0'
而不是0
传递
并且(尽管几乎从未使用过),任何整数都将用作第二个参数。1409是自1900年1月以来的月数。
01-01-1900是SQL Server的默认日期 如果您执行:
select DATEADD(mm,-1409, GETDATE())
您将在
Sql Server
中找到:1900-01-16 14:25:09.760
0
转换为1900-01-01 00:00.000
。那么1900-01-01
和2017-06-16
之间的month
差异是1409
,但为什么呢?1900-01-01的意义是什么?ISDATE
从技术上讲没有说谎:0
不是有效的DATETIME
表达式,它是INT
。但是,INT
可以隐式转换为DATETIME
。Sql Server的第一个日期和