2015-10-07 53 views
1

有人可以幫我理解下面兩個查詢如何給出完全相同的結果嗎?關於dateadd函數的第三個參數的T-sql混淆

SELECT DATEADD(MM, DATEDIFF(MM, 0, GETDATE()) + 1, -1) 
SELECT DATEADD(MM, DATEDIFF(MM, 0, GETDATE()) + 1, 0)- 1 

我明白寫在下面的查詢是如何工作的

SELECT DATEADD(MM, DATEDIFF(MM, 0, GETDATE()) + 1, 0) 

我想我不能環繞我的頭「-1」中的兩個查詢。

回答

2

兩個語句都返回當前月份的最後一天,這是流程:

(!)
SELECT DATEDIFF(MM, 0, GETDATE()) /* Number of months from year 0=1900-01-01 (1389) */ 
SELECT DATEDIFF(MM, 0, GETDATE()) + 1 /* Adds 1 month to above int (1390) */ 
SELECT DATEADD(MM, 1390, 0) /* Adds 1390 back to year 0 (2015-11-01) */ 
-1 simply takes one day off this date and you get 2015-10-31 

主要是GETDATE()+ 1,其中它增加了1一天,但舊的日期和時間格式,這僅適用,如果你嘗試這樣它會失敗:

SELECT CAST(0 As DateTime2) -1 

,而這個工程:

SELECT CAST(0 As DateTime) -1 

澄清:GETDATE()返回DateTime類型,這是確定使用+我,但如果你曾經嘗試做一個+1到DATETIME2你會得到和錯誤。

1

讓我們打破查詢...

select DATEDIFF(MM, 0, GETDATE()) + 1 //it will give 1390 as OutPut 

現在把這個輸出你的查詢..

SELECT DATEADD(MM, 1390, -1) // it will give 2015-10-31 00:00:00.000 
SELECT DATEADD(MM, 1390, 0) // it will give 2015-11-01 00:00:00.000 

現在把所有瘦客戶機在我們原來的查詢

SELECT DATEADD(MM, 1390, -1) //it will give 2015-10-31 00:00:00.000 
SELECT DATEADD(MM, 1390, 0)- 1 //first dateadd function give this 2015-11-01 00:00:00.000 date then we subtract it by 1 day. hence it will give same op as above query.