Excel中有个计算日期差的函数datedif,SqlServer中也有一个类似函数datediff,但是两个函数的计算逻辑是不一致的:
Excel中的datedif函数,计算精度到日,不足日的月份差额要减一,不足月的年份差额要减一,例如
DATEDIF("1976-09-29","2022-09-28","y") = 45
但是在SqlServer中,计算年份日期差是直接按照年份数值相减,而不会考虑是否足月;计算月份差也是直接年份加月份相减,也不会考虑日期是否不足,所以上面两个日期在SqlServer中计算结果会不一样
SELECT DATEDIFF(yy,'1976-09-29', '2022-09-28') = 46
项目中有个需求需要计算人员实际年龄,如果在Excel中计算就非常容易,直接用DATEDIF函数就能算出人员实际年龄,但是如果在SqlServer中,就稍微麻烦点了,直接使用DATEDIFF函数算出来的实际年龄是虚岁,所以要改一下sql的计算,修改如下:
SELECT
CASE WHEN MONTH(getdate())-MONTH('1976-09-29') > 0
THEN
year(getdate())-year('1976-09-29')
ELSE
CASE WHEN MONTH(getdate())-MONTH('1976-09-29') = 0
THEN
CASE WHEN Day(getdate()) - Day('1976-09-29') < 0
THEN
year(getdate())-year('1976-09-29')-1
ELSE
year(getdate())-year('1976-09-29')
END
ELSE
year(getdate())-year('1976-09-29')-1
END
END