如何基于生日计算年龄?TSQL、Oracle及其他数据库实现
别再用
DATEDIFF(YEAR, date_of_birth, GETDATE())算年龄了!这是个常见误区 经常看到有人在SQL Server里用这个语句计算用户当前年龄,但遗憾的是,这并不准确。
问题根源:DATEDIFF的逻辑不是你想的那样
DATEDIFF函数不是统计两个日期之间的完整时间间隔,而是统计两个日期之间跨越的日历边界数量:
- 当参数是
YEAR时,它数的是两个日期之间跨越了多少次1月1日 - 参数为
MONTH时,统计的是跨越每月1日的次数 - 哪怕是
DAY参数,它统计的也是跨越午夜的次数(不过这个场景下差异不大)
举个直观的例子:假设某人出生于2000年12月31日,今天是2024年1月1日。用DATEDIFF(YEAR, '2000-12-31', '2024-01-01')会返回24,但实际上这个人刚过完23岁生日,要到2024年12月31日才满24岁。这就是因为函数只看到跨越了24次1月1日,完全没考虑生日是否在今年已经到来。
正确的周岁计算方法
要准确算出当前的周岁年龄,需要结合年份差和生日是否已过的判断,比如这个写法:
SELECT DATEDIFF(YEAR, date_of_birth, GETDATE()) - CASE WHEN DATEADD(YEAR, DATEDIFF(YEAR, date_of_birth, GETDATE()), date_of_birth) > GETDATE() THEN 1 ELSE 0 END AS current_age
简单来说就是:先算出年份差,再检查今年的生日是否还没到,如果没到就减1,这样得到的就是真实的周岁年龄了。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

