윤년에주의하십시오. 2 월 29 일부터 2 월 28 일까지 어떻게 대우 받으시겠습니까? 그것은 긴 줄에있는 스크롤 막대없이 더 나은 모습 때문에
case
when year(coalesce(EndDateTime, getdate()) > year(StartDateTime)
then
datediff(year, StartDateTime, coalesce(EndDateTime, getdate())) -
case
when
EndDateTime is not null and
datepart(month, EndDateTime) < datepart(month, StartDateTime)
or datepart(month, EndDateTime) = datepart(month, StartDateTime)
and datepart(day, EndDateTime) < datepart(day, StartDateTime)
then 1
when
EndDateTime is null and
datepart(month, getdate()) < datepart(month, StartDateTime)
or datepart(month, getdate()) = datepart(month, StartDateTime)
and datepart(day, getdate()) < datepart(day, StartDateTime)
then 1
else 0
end
else 0
end
나는 대부분
EndDateTime
및
getdate()
가지 경우 분할.
날짜가 엄격하게 일치하지 않아도 로직을 조정하고 윤년 조건을 전체 연도로 간주하는 한 가지 방법이 있습니다. 위의 방법으로 "분할"논리를 유지한다면이 표현식을 복사해야합니다 (대체 getdate() for
EndDateTime everywhere except the
은 null 테스트입니다). 당신이 접근 방식을 이해하면
http://rextester.com/SBH69843
when
EndDateTime is not null and
datepart(month, EndDateTime) < datepart(month, StartDateTime)
or datepart(month, EndDateTime) = datepart(month, StartDateTime)
and datepart(day, EndDateTime) < datepart(day, StartDateTime)
and not -- here's one way to catch the leap day condition
(
-- adding one day this way is deprecated and only works with datetime
and datepart(month, StartDateTime + 1) > datepart(month, StartDateTime)
and datepart(month, EndDateTime + 1) > datepart(month, EndDateTime)
)
는, BTW YYYYMMDD 형식의 숫자에 연산을 사용하여 동일한 논리를 응축 할 수있는 방법이있다.
(
cast(convert(varchar(8), @EndDateTime, 120) as int) -
cast(convert(varchar(8), @StartDateTime, 120) as int)
)/10000
위의 모든 복잡한 논리는 간단히 빼기에서 수십 년을 빌린 것입니다. 그것은 거의 같은 것입니다.
당신이 당신의 샘플 데이터에서 원하는 결과를 보여줄 수 있습니까? – Aducci
[생년월일 및 getDate()를 기준으로 연령 (년)을 계산하는 방법] (http://stackoverflow.com/questions/1572110/how-to-calculate-age-in-years-based- 생년월일 및 생년월일) –
@ JeremyDanyow 그 다른 질문에 대한 대부분의 대답은 컴퓨팅 시대에 대한 접근법을 가지고있는 다른 사람들이 있다고 확신하지만 분명히 복잡하고 잘못된 것 같습니다 언어에 관계없이) – shawnt00