2017-06-16 84 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