SQL DATEDIFF 函数

SQL DATEDIFF function

我正在 SQL 服务器上使用 SSMS 2014

select DATEDIFF(MM, 0, GETDATE())

输出为 1409(运行 于 16-06-2017)

我很困惑,因为 DATEDIFF 语法的第 2 个和第 3 个参数应该是一个有效的日期,但是当第 2 个参数为 0 时,这个查询是如何以及为什么执行并给出结果的。

我检查了给出语法错误的 ISDATE(0) 和 ISDATE('0'),所以如果 0 不是有效日期,那么为什么 DATEDIFF 接受它并给出结果。

文档指定:

startdate

Is an expression that can be resolved to a time, date, smalldatetime, datetime, datetime2, or datetimeoffset value.

"can be resolved" 与 "is the type of" 是不一样的。

因此,整数 被解释为自“1899-12-31”以来的天数。但是,字符串不会被解释为天数,即使它们看起来像数字。

ISDATE() 接受一个 字符串 参数,因此它将 0 转换为 '0''0' 不是日期格式。事实上,datediff() 将失败,第二个参数作为 '0' 而不是 0.

传递

并且(虽然几乎从未使用过),任何整数都可以作为第二个参数。

1409 是自 1900 年 1 月以来的月数。

01-01-1900 是 SQL 服务器的默认日期。

如果你执行:

select DATEADD(mm,-1409, GETDATE())

你会发现:1900-01-16 14:25:09.760