2011-02-14 3 views
2

두 날짜 사이의 연도 차이를 계산해야합니다.Realy year datediff (1 년 미만)

은 DATEDIFF를 사용하지만, 날짜의 적은을 예를 들어 것을 시도 :

다음
Date 1: 07/03/2011 
Date 2: 07/02/2012 

(Date format MM/DD/YYYY) 

: DATEDIFF ([YYYY] '07/03/2011 ', '07// 2012 02') = 1

하지만 실제 차이는 0 년입니다.

답변

1

아무도 정확한 해결책을 찾지 못했기 때문에 아무도 알아 차리지 못할지라도 내 게시물을 게시합니다. 이 방법은 기본적으로 다음 방법과 동일

declare @d1 datetime 
declare @d2 datetime 

set @d1 = '1968-02-29' 
set @d2 = '2011-02-28' 

select datediff(year, @d1, @d2)- 
case when month(@d1)*32 + day(@d1) > month(@d2) * 32 + day(@d2) then 1 else 0 end 
--case when month(@d2)*32 + day(@d1) > month(@d2) * 32 + day(@d2) then 1 else 0 end 

는, 차이는 내가 들었다 캐스팅, 느렸다을 방지하기 위해 숫자 수행된다는 점이다.

select datediff(year, @d1, @d2)- 
case when convert(char(5),@d1, 1) > convert(char(5),@d2, 1) then 1 else 0 end 
+0

이 답변은 잘못되었습니다. 내 테스트 사례보기 - 한 달에 32 일이라는 재미있는 수학 때문에 2012-02-29와 2013-03-01 사이에 0 년을 제공합니다. – RichardTheKiwi

+0

@ ReichardAkaCyberkiwi 맞습니다. 오타가 수정되었습니다. –

+0

@RichardAkaCyberkiwi 내 재미있는 수학은 Itzik Ben-Gan이 사용하는 것과 같습니다. 유일한 차이점은 그가 100으로 번식한다는 것입니다. 나는 지금 그것을 보았습니다. –

0

예, DATEDIFF은 모든 날짜 부분에서 작동합니다. 따라서 일의 차이를 계산 한 다음 365로 나누어야합니다 (하루 중 시간에 신경 쓰지 않는다면). Si : 시도해보십시오.

DECLARE @StartDate DATETIME, @EndDate DATETIME 
SET @StarDate= '20110307' 
SET @EndDate = '20120207' 
SELECT DATEDIFF(DAY,@StartDate, @EndDate)/365 
+0

그는 일년 중 일수를 결정하기를 원할 것입니다. 2012 년에 그의 예에 따르면 365는 작동하지 않습니다. 또한 그는 포함 된 날짜가 윤년을 포함하여 2 월 29 일인지 여부를 확인해야합니다. – Matthew

+0

잘못된 - 2012-03-06 끝, 2011-03-07 시작 결과 = 1 – RichardTheKiwi

1

[yyyy]을 지정하면 SQL Server에서 1 년 차이가 발생합니다.

DATEDIFF([yyyy], '07/03/2011', '12/31/2011')의 경우 0을 반환합니다. 당신은 365 또는 3백66일를 찾고 있다면 그것은 귀하의 경우에는 1

를 반환합니다 DATEDIFF([yyyy], '07/03/2011', '01/01/2012')를 들어

당신은 일을 계산해야합니다

DATEDIFF([dd], '07/03/2011', '07/02/2012')/366 
+1

년이 갈수록 366 일이 걸릴 수 있기 때문에 더 정확하지 않습니다. 365/366 일 수 있습니다. – RichardTheKiwi

+0

나는 "365 또는 366"이라고 말했습니다. 개정 내역을 보면 365라는 것을 알 수 있습니다. 그런 다음 JMira의 예제 데이터에 맞게 변경했습니다. 조건문 등을 사용하여 전체 솔루션을 제공 할 수는 있지만 시간이 없습니다 ... –

+0

글쎄, 365 또는 366은 모두 똑같이 ... 정확하지 않습니다 ... – RichardTheKiwi

2

이 작동합니다

declare @date1 datetime 
declare @date2 datetime 
select @date1 = '20110703', @date2 = '20120703' 

select case 
    when dateadd(yy, DATEDIFF(yy, @date1, @date2), @date1) > @date2 
    then DATEDIFF(yy, @date1, @date2) -1 
    else DATEDIFF(yy, @date1, @date2) end 

많은 가장자리 조건을 보여주는 완전한 테스트 케이스

create table dates(id int identity, date1 datetime, date2 datetime) 
insert dates select '20110703', '20120703' 
insert dates select '20110703', '20120702' 
insert dates select '20110702', '20120703' 
insert dates select '20110228', '20120228' 
insert dates select '20120229', '20130228' 
insert dates select '20120229', '20130301' 
insert dates select '20110301', '20120229' 
insert dates select '20120229', '20160301' 
insert dates select '20120229', '20160229' 
insert dates select '201', '20110101' 
insert dates select '20100101', '20111231' 

select date1, date2, 
    case 
    when dateadd(yy, DATEDIFF(yy, date1, date2), date1) > date2 
    then DATEDIFF(yy, date1, date2) -1 
    else DATEDIFF(yy, date1, date2) end 
from dates 
order by id 
+0

'DATEADD'는 여전히 datepart에 추가됩니다. 포함 된 연도의 정해진 일수 (내 대답 당)로 정의하는 경우가 아니면 OP의 문제 (+1)를 해결할 수 있습니다. – Matthew

+0

@Matthew는 각 사례를 살펴보고 3 번째 열에 동의하지 않으면 알려주십시오. 출력에. '기념일'에 도달 한 경우에만 1 년이 경과 한 '생일'정의와 일치합니다. – RichardTheKiwi

+0

@cyberwiki '기념일 날짜'기준을 사용하면 답변이 훌륭합니다. (가장 동의합니다 : D) "1 년"의 다양한 정의로 지나치게 복잡합니다. – Matthew