[英](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.