SQLDateDiff函数

SQLDateDiff函数,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

我正在使用SSMS 2014处理SQL server

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的第一个日期和