簡體   English   中英

(Transact-SQL)DATEDIFF和leap年

[英](Transact-SQL) DATEDIFF and leap years

我對DATEDIFF函數有問題。

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

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

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


我該怎么做才能保持准確的計數? 謝謝。

我相信以下邏輯可以滿足您的需求:

   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

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

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

也檢查一下

從技術上講,一年中有365.242天(考慮leap年),因此:

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)

結果集:

--------------------------------------- ---------------------------------------
34                                      35

干杯!

計算end_date中的leap天數減去start_date中的leap天數。 從您的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年1月和2月

/ 1461是leap年之間的天數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM