2017-06-16 71 views
1

我SQL服务器上使用SSMS工作2014SQL DATEDIFF函数

select DATEDIFF(MM, 0, GETDATE()) 

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

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

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

+7

'0'转化为'1900-01-01 00:00:00.000'在'的Sql Server'。所以'1900-01-01'和'2017-06-16'之间'月份'的差异是'1409' –

+0

,但是为什么? 1900-01-01有什么意义? –

+0

'ISDATE'没有说谎,在技术上:'0'不是一个有效的'DATETIME'表达式,它是一个'INT'。但是,INT可以隐式转换为DATETIME。 –

回答

2

的文档指定:

STARTDATE

是可解析为时间,日期,SMALLDATETIME, 日期时间,DATETIME2或DATETIMEOFFSET值的表达式。

虽然细微的区别,“可以解决”是不一样的“是类型”。

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

ISDATE()需要参数,因此它被转换到0'0'。而'0'不是日期格式。实际上,datediff()将失败,并将第二个参数作为'0'而不是0传递。

而且(虽然几乎从未使用),任何整数将作为第二个参数。

0

1409的月数月以来1900年

1900年1月1日是SQL Server的默认日期。

如果执行:

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

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