残念ながら、2 つの日付の違いに関する通常の人間の直感ではなく、要素の遷移DATEDIFF
の数を計算します (例:年の差があると言う人は多くありませんが、1 です)。DATEDIFF(year,'20121231','20130101')
私が使用するソリューションは少し反復的ですが、別の関数を必要とせず、うるう年などを常に正しく取得します。
declare @T table (
DateEngaged datetime not null,
MonthsInService as CASE
WHEN DATEADD(month,DATEDIFF(month,DateEngaged,GETDATE()),DateEngaged) > GETDATE()
THEN DATEDIFF(month,DateEngaged,GETDATE()) - 1
ELSE DATEDIFF(month,DateEngaged,GETDATE())
END,
YearsInService as CASE
WHEN DATEADD(year,DATEDIFF(year,DateEngaged,GETDATE()),DateEngaged) > GETDATE()
THEN DATEDIFF(year,DateEngaged,GETDATE()) - 1
ELSE DATEDIFF(year,DateEngaged,GETDATE())
END
)
insert into @T (DateEngaged) values ('20120409'),('20120408')
select * from @T
プロデュース:
DateEngaged MonthsInService YearsInService
----------------------- --------------- --------------
2012-04-09 00:00:00.000 11 0
2012-04-08 00:00:00.000 12 1
これは、「 によって生成された単純な回答を使用するとDATEDIFF
、1 だけ高すぎる回答が与えられるか?」と尋ねることによって機能します。- もしそうなら、それが与える答えから 1 を引くだけです。DATEDIFF
1 だけオーバーする必要があります。