You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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;

小建议

尽量把出生日期存储为日期类型(比如DATEDATETIME),这样不仅能精准计算年龄,后续扩展功能(比如按生日发提醒)也更方便。

内容的提问来源于stack exchange,提问作者allen

火山引擎 最新活动