如何编写单条SQL语句查询未来60天内的生日人员列表
跨年度生日查询的SQL解决方案
针对年末查询未来60天生日时,因跨年度导致日期字符串比较失效的问题,可通过构造当年或下一年的实际庆祝日期来实现准确查询,以下是两种可行的单条SQL实现方式:
方法一:构造实际庆祝日期(推荐,兼容闰年)
通过判断生日的当年日期是否已过,自动切换到下一年的日期,再筛选并排序:
SELECT name, dateofbirth FROM friends WHERE -- 计算当前或下一年的生日日期,判断是否在未来60天内 CASE -- 如果今年的生日已经过了,就用下一年的日期 WHEN STR_TO_DATE(CONCAT(YEAR(NOW()), '-', DATE_FORMAT(dateofbirth, '%m-%d')), '%Y-%m-%d') < NOW() THEN STR_TO_DATE(CONCAT(YEAR(NOW()) + 1, '-', DATE_FORMAT(dateofbirth, '%m-%d')), '%Y-%m-%d') -- 否则用今年的生日日期 ELSE STR_TO_DATE(CONCAT(YEAR(NOW()), '-', DATE_FORMAT(dateofbirth, '%m-%d')), '%Y-%m-%d') END BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 60 DAY) ORDER BY -- 按实际庆祝日期排序 CASE WHEN STR_TO_DATE(CONCAT(YEAR(NOW()), '-', DATE_FORMAT(dateofbirth, '%m-%d')), '%Y-%m-%d') < NOW() THEN STR_TO_DATE(CONCAT(YEAR(NOW()) + 1, '-', DATE_FORMAT(dateofbirth, '%m-%d')), '%Y-%m-%d') ELSE STR_TO_DATE(CONCAT(YEAR(NOW()), '-', DATE_FORMAT(dateofbirth, '%m-%d')), '%Y-%m-%d') END;
方法二:利用年积日(DAYOFYEAR)比较
通过年积日(一年中的第几天)进行判断,跨年度时给下一年的生日年积日加365:
SELECT name, dateofbirth FROM friends WHERE -- 情况1:生日在今年剩余的60天内 (DAYOFYEAR(NOW()) <= DAYOFYEAR(dateofbirth) AND DAYOFYEAR(dateofbirth) <= DAYOFYEAR(DATE_ADD(NOW(), INTERVAL 60 DAY))) OR -- 情况2:生日在明年年初的60天范围内(跨年度) (DAYOFYEAR(NOW()) > DAYOFYEAR(dateofbirth) AND DAYOFYEAR(dateofbirth) + 365 <= DAYOFYEAR(DATE_ADD(NOW(), INTERVAL 60 DAY)) + 365) ORDER BY -- 按年积日排序,跨年度的生日加365保证顺序正确 CASE WHEN DAYOFYEAR(dateofbirth) >= DAYOFYEAR(NOW()) THEN DAYOFYEAR(dateofbirth) ELSE DAYOFYEAR(dateofbirth) + 365 END;
结果验证
当在2022年12月2日执行查询时,两种方法都会返回符合要求的结果:
HIJ, 1986-12-09
GHI, 1989-12-19
EFG, 1999-01-10
FGH, 1987-01-15
内容的提问来源于stack exchange,提问作者Kladizkov
相关产品推荐
相关产品推荐

