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
我正在 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