不幸的是,DATEDIFF
它计算元素的转换次数,而不是通常的人类直觉对两个日期之间的差异(例如DATEDIFF(year,'20121231','20130101')
是 1,尽管没有多少人会说有一年的差异)。
我使用的解决方案有点重复,但不需要单独的函数,并且总是得到正确的闰年:
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?” - 如果是这样,我们只需从它给出的答案中减去一个。DATEDIFF
应该只超过 1。