我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。 –