SQL筛选40岁以下医生问题:日期计算返回NULL求助
嘿,我来帮你搞定这个年龄筛选的问题!你的思路是对的——通过当前年份减出生年份得到年龄,再筛选40岁以下的医生,但之前的SQL语句逻辑和函数用法都出了点问题,我来一步步给你理清楚:
先分析你之前的错误
- 第一个语句
dateadd(year, date_birthday, getdate()):这个函数的用法搞反啦!DATEADD是给指定日期加上一个时间间隔,你这里相当于把当前日期加上出生年份,得到的是一个离谱的未来日期,完全不是年龄,自然没法用来筛选。 - 第二个语句
CAST((CURDATE()-date_birthday) AS DATE):直接用日期相减得到的是天数差,把天数转成DATE类型完全不符合逻辑,所以返回NULL是必然的,这根本不是计算年龄的正确方式。
正确的解决方案(分两种情况)
首先得明确你的date_birthday字段是日期类型(比如'1990-03-15')还是纯年份整数(比如1990),两种情况的写法略有不同:
情况1:date_birthday是日期类型(推荐用这种存储方式)
如果是MySQL数据库,直接用TIMESTAMPDIFF函数,它能精准计算两个日期之间的年份差,还会考虑当年的生日是否已经过了(比如今天是2024年5月,某人1984年6月出生,那他现在还是39岁,会被正确筛选出来):
SELECT * FROM `doctor` WHERE TIMESTAMPDIFF(YEAR, `date_birthday`, CURDATE()) < 40;
如果是SQL Server数据库,计算年龄需要稍微复杂一点,要判断生日是否过了避免提前算满岁:
SELECT * FROM doctor WHERE DATEDIFF(YEAR, date_birthday, GETDATE()) - CASE WHEN DATEADD(YEAR, DATEDIFF(YEAR, date_birthday, GETDATE()), date_birthday) > GETDATE() THEN 1 ELSE 0 END < 40;
情况2:date_birthday是纯年份整数(比如存储的是1985)
这种情况就简单多了,直接用当前年份减去出生年份就行:
-- MySQL写法 SELECT * FROM `doctor` WHERE (YEAR(CURDATE()) - `date_birthday`) < 40; -- SQL Server写法 SELECT * FROM doctor WHERE (YEAR(GETDATE()) - date_birthday) < 40;
小建议
尽量把出生日期存储为日期类型(比如DATE或DATETIME),这样不仅能精准计算年龄,后续扩展功能(比如按生日发提醒)也更方便。
内容的提问来源于stack exchange,提问作者allen




