我有一個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
。發生這種情況是因爲我的查詢不考慮閏年。
我能做些什麼來保持準確的計數? 謝謝。
我有一個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
。發生這種情況是因爲我的查詢不考慮閏年。
我能做些什麼來保持準確的計數? 謝謝。
我相信下面的邏輯你想要做什麼:
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
還要檢查this
技術上會有一年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:
乾杯!
計算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是天的閏年
有一年接近365.25天之間的數,所以你不要指望你的算術是正確的。 – 2014-08-29 10:51:21