2014-08-29 2 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

는 1 년에 365.25 일 가까이있다 윤년 사이의 일 수있는 무시 올바른지. –

답변

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

+0

@ Andryx93. . . 2014-01-05는 올해의 다섯 번째 날입니다. 5를 공제하면 2013-12-31이됩니다. 아이디어는 비교를 위해 날짜를 연초로 표준화하는 것입니다. –

+0

정말 고마워요! – Andryx93

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

기술적으로 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은