2014-08-29 174 views
0

我有一個DATEDIFF函數的問題。(Transact-SQL)DATEDIFF和閏年

我的日期格式是dd/mm/yyyy

@START_DATE = 01/02/2004
@END_DATE = 29/01/2014

查詢(DATEDIFF(DAY,@START_DATE,@END_DATE)/365)回報10,但正確的年數爲9。發生這種情況是因爲我的查詢不考慮閏年。


我能做些什麼來保持準確的計數? 謝謝。

+1

有一年接近365.25天之間的數,所以你不要指望你的算術是正確的。 – 2014-08-29 10:51:21

回答

0

我相信下面的邏輯你想要做什麼:

datediff(year, 
      @START_DATE - datepart(dayofyear, @START_DATE) + 1, 
      @END_DATE - datepart(dayofyear, @START_DATE) + 1 
      ) as d2 

注:這會將該日期作爲datetime,因爲算術更容易表達。你也可以寫爲:

datediff(year, 
      dateadd(day, - datepart(dayofyear, @START_DATE) + 1, @START_DATE), 
      dateadd(day, - datepart(dayofyear, @START_DATE) + 1, @END_DATE) 
      ) as d2 

下面的查詢是一個演示:

select datediff(year, 
       startdate - datepart(dayofyear, startdate) + 1, 
       enddate - datepart(dayofyear, startdate) + 1 
       ) as d2 
from (select cast('2004-02-01' as datetime) as startdate, 
      cast('2014-01-31' as datetime) as enddate 
     union all 
     select cast('2004-02-01' as datetime) as startdate, 
      cast('2014-02-01' as datetime) as enddate 

    ) t 
+0

它的工作原理! :D但我有一個問題:爲什麼要添加+1? – Andryx93 2014-08-29 13:23:44

+0

@ Andryx93。 。 。 2014-01-05是今年的第五天。如果你減去5,你會得到2013-12-31。這個想法是將日期規範化爲年初以進行比較。 – 2014-08-29 13:35:53

+0

非常感謝! – Andryx93 2014-08-29 13:57:34

1

您可以創建一個函數來解決:

CREATE FUNCTION [dbo].[getYears] 
(
    @START_DATE datetime, 
    @END_DATE datetime 
) 
RETURNS int 
AS 
BEGIN 
    DECLARE @yrs int 
    SET @yrs =DATEDIFF(year,@START_DATE,@END_DATE) 
    IF (@END_DATE < DATEADD(year, @yrs, @START_DATE)) 
     SET @yrs = @yrs -1 
    RETURN @yrs 
END 

還要檢查this

1

技術上會有一年365.242天,佔閏年,所以當:

FLOOR(DATEDIFF(day, @STARTDATE, @ENDDATE)/365.242) 

應該更正確。

測試:

SELECT FLOOR(DATEDIFF(day, '1980-01-16','2015-01-15')/365.242), 
     FLOOR(DATEDIFF(day, '1980-01-16','2015-01-16')/365.242) 

的ResultSet:

乾杯!

0

計算end_date中閏日的數量在start_date中減去閏日的數量。從你的DATEDIFF中扣除答案。

DECLARE 
    @START_DATE DATETIME = '2004-02-01', 
    @END_DATE DATETIME = '2014-01-29' 

SELECT (
     DATEDIFF(DAY,@START_DATE,@END_DATE) 
      - (
       (CONVERT(INT,@END_DATE - 58)/1461) 
       - 
       (CONVERT(INT,@START_DATE - 58)/1461) 
      ) 
     )/365 

-58忽略月和1900年2月

/1461是天的閏年