2014-07-10 60 views
1

計算如何發生在DATEADD MONTH DATEPART()DATEADD計算

添加月

SELECT '2012-01-29' AS [Date], CAST(DATEADD(MONTH, 1, '2012-01-31') AS DATE) AS NextDate 
UNION 
SELECT '2012-01-31' AS [Date], CAST(DATEADD(MONTH, 1, '2012-01-31') AS DATE) AS NextDate 
UNION 
SELECT '2013-01-31' AS [Date], CAST(DATEADD(MONTH, 1, '2013-01-31') AS DATE) AS NextDate 

結果

enter image description here

SUBT RACT月

SELECT '2012-02-29' AS [Date], CAST(DATEADD(MONTH, -1, '2012-02-29') AS DATE) AS PrevDate 
UNION 
SELECT '2012-03-01' AS [Date], CAST(DATEADD(MONTH, -1, '2012-03-01') AS DATE) AS PrevDate 

結果

enter image description here

當我加了一個月的日期29,30,31 of Jan'2012,我得到了相同的結果February 29。對於日期爲29 Feb'2012的相減,其顯示29 Jan'2012。沒有辦法得到日期30 & 31 of Jan'2012

我想知道一些簡單的解釋。

回答

3

該行爲是在文檔中明確記錄爲DATEADD

DATEADD (datepart , number , date) 

...

如果日期部分日期個月比多天返回月份和日期返回月份中不存在的日期,最後一天返回月份返回。例如,9月有30天;因此,以下兩個語句返回2006-09-30 00:00:00.000:

SELECT DATEADD(month, 1, '2006-08-30'); 

SELECT DATEADD(month, 1, '2006-08-31'); 

至於爲什麼有這樣的行爲,這一切都歸結爲一個事實,即變長意味着幾個月你必須在執行日期數學時應用某種形式的權衡,並且沒有一個「正確的」答案存在。你認爲1月31日是「1月的最後一天」還是「1月1日後的30天」?這兩者都是關於31號的正確思路。但是,如果將January更改爲February,則現在可以獲得兩個不同日期 - 「2月最後一天」的2月28日或29日或「2月1日後30天」的3月2日或3日。

但函數只能返回一個值。

我不是說SQL Server應用上述解釋之一。但是,它的功能確保瞭如果您在特定日期添加1個月,則可以確保結果日期在下個月內。