2012-08-14 27 views
0

我已經提到this on MSDN但我仍然不能確定在DATEDIFF函數的第二個參數是做在下面兩個例子:混亂在DATEDIFF函數的第二個參數

SELECT DATEDIFF(yy,0,getdate()) --run 14 AUG這將返回112

SELECT DATEDIFF(yy,1000,getdate()) - 我選擇了1000任意和8月14日運行此返回110

通常我會用DATEDIFF找到兩個個月,第二間的年度天數,或數論證是一個日期。

原因我想上述理解的是最終了解以下信息:

SELECT DATEADD(yy, DATEDIFF(yy,0,GETDATE()), 0)

回答

3

如果您使用整數作爲第二個參數(或針對該事件的任何datetime/smalldatetime賦值),則將其解釋爲自1900-01-01以來的天數。

DECLARE @d1 DATETIME = 0, @d2 DATETIME = 1; 
SELECT @d1, @d2; 

結果:

1900-01-01 00:00:00.000 1900-01-02 00:00:00.000 

請注意,這並不是新的數據類型,如DATE直接分配期間工作:

DECLARE @d DATE = 0; 

結果:

消息206 ,等級16,狀態2,行1
操作數類型衝突:INT與日期

不兼容,但它仍然可以使用日期的功能,如工作:

DECLARE @d DATE = DATEADD(YEAR, 0, SYSDATETIME()); 
SELECT @d; 

結果:

2012-08-14 

對於這些不一致的原因,我建議您使用適當的日期文字,以便清楚地表明您指的是哪個日期,並且無論數據類型如何,它都能正常工作。這是我發現很難打破的習慣,因爲打字0比19000101更容易...

+0

所以如果我有第二個參數爲1000那麼它是在1900-01-01之後的1000天? – whytheq 2012-08-14 15:21:57

+0

@whytheq是的,這是正確的。 – 2012-08-14 15:23:32

+0

感謝您的額外解釋 – whytheq 2012-08-14 15:38:52

1

的第二個參數DATEDIFF()是一個日期。

第一個示例返回SQL Server世界中的「開始」時間。那將是目前的112年。

第二個例子是非常不合理的。如所實施的那樣,日期表示爲自最早日期以來的天數。這是自最早日期1000天以來的年數。

最後一個示例將基準日期添加了若干年。然後它增加了幾個月。由於基準日期是1/1/1900,因此這是第y年第n個月後第一天的第一個日期。

+0

+1謝謝你的幫助 – whytheq 2012-08-14 15:39:22

2

考慮下面的例子以更好地理解這個概念。0是默認日期"1900-01-01"

下面查詢給出輸出作爲2017-10-31 00:00:00.000

SELECT DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH,0,SYSDATETIME())+3, 0)) 

除以上述查詢成各種零件理解計算。

-- 1414 Months since '1900-01-01' 
    SELECT DATEDIFF(MONTH,0,SYSDATETIME()) + 3 

-- adding 1414 Months to Default date 1900 Produces '2017-11-01 00:00:00.000' 
    SELECT DATEADD(MONTH, DATEDIFF(MONTH,0,SYSDATETIME())+3, 0) 

--Subtract 1 day from '2017-11-01 00:00:00:000' gives last day of previous month. 
    SELECT DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH,0,SYSDATETIME())+3, 0))