我SQL服务器上使用SSMS工作2014SQL DATEDIFF函数
select DATEDIFF(MM, 0, GETDATE())
给作为1409输出(16-06-2017运行)
我很困惑,因为DATEDIFF语法的第二和第三个参数应是一个有效的日期,但在这里如何以及为什么这个查询执行并给出第二个参数为0时的结果。
我检查了给出语法错误的ISDATE(0)和ISDATE('0'),所以如果0不是有效的日期,那么为什么DATEDIFF接受它并给出结果。
我SQL服务器上使用SSMS工作2014SQL DATEDIFF函数
select DATEDIFF(MM, 0, GETDATE())
给作为1409输出(16-06-2017运行)
我很困惑,因为DATEDIFF语法的第二和第三个参数应是一个有效的日期,但在这里如何以及为什么这个查询执行并给出第二个参数为0时的结果。
我检查了给出语法错误的ISDATE(0)和ISDATE('0'),所以如果0不是有效的日期,那么为什么DATEDIFF接受它并给出结果。
的文档指定:
STARTDATE
是可解析为时间,日期,SMALLDATETIME, 日期时间,DATETIME2或DATETIMEOFFSET值的表达式。
虽然细微的区别,“可以解决”是不一样的“是类型”。
因此,整数被解释为自'1899-12-31'以来的天数。但是,字符串不会被解释为天,即使它们看起来像一个数字。
ISDATE()
需要串参数,因此它被转换到0
'0'
。而'0'
不是日期格式。实际上,datediff()
将失败,并将第二个参数作为'0'
而不是0
传递。
而且(虽然几乎从未使用),任何整数将作为第二个参数。
1409的月数月以来1900年
1900年1月1日是SQL Server的默认日期。
如果执行:
select DATEADD(mm,-1409, GETDATE())
你会发现:1900-01-16 14:25:09.760
'0'转化为'1900-01-01 00:00:00.000'在'的Sql Server'。所以'1900-01-01'和'2017-06-16'之间'月份'的差异是'1409' –
,但是为什么? 1900-01-01有什么意义? –
'ISDATE'没有说谎,在技术上:'0'不是一个有效的'DATETIME'表达式,它是一个'INT'。但是,INT可以隐式转换为DATETIME。 –