我有一个表,上面有一些名字和出生日期。
参考数据:
ABC, 1990-11-23
BCD, 1998-10-21
CDE, 1997-05-02
DEF, 2000-10-15
EFG, 1999-01-10
FGH, 1987-01-15
GHI, 1989-12-19
HIJ, 1986-12-09
我需要一个SQL查询,我需要得到的生日庆祝日期,将发生在未来60天内按庆祝日期排序。
这是我到目前为止使用的查询。
SELECT *
FROM `friends`
WHERE ( DATE_FORMAT(`dob`, '%m%d') >= DATE_FORMAT(CURDATE(), '%m%d')
AND DATE_FORMAT(`dob`, '%m%d') <= DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 60 DAY), '%m%d')
ORDER BY DATE_FORMAT(`dob`, '%m%d');
如果它在一月到十月期间运行,则可以正常工作。在十一月和十二月期间,条件DATE_FORMAT(dob
,'%m% d')〈= DATE_FORMAT(DATE_ADD(CURDATE(),INTERVAL 60 DAY),'%m% d')不能应用。例如,结果比较将类似于1209〈0131,因此将失败。
我希望在2022年12月2日执行时得到的结果是
HIJ, 1986-12-09
GHI, 1989-12-19
EFG, 1999-01-10
FGH, 1987-01-15
如何在一个查询中完成此操作?
1条答案
按热度按时间00jrzges1#
在你的问题的评论中提到的线程使用了像增加365.25天这样的东西来让这个工作。我认为这个解决方案可能更可靠。
您可以通过从出生日期中提取月份和日期,并使用
STR_TO_DATE
将当前年份连接到该日期来构造今年的生日。然后,您可以使用
CASE
语句检查今年的生日是否已经过去,在这种情况下,您可以在该生日后添加一年,因为这将是name
的下一个生日。然后,您可以检查CASE语句的结果是否为BETWEEN
今天和60天后。我使用CTE使其更清晰地阅读。DBfiddle here。
| 姓名|多布|
| - -|- -|
| GHI公司|一九八九年十二月十九日|
| HIJ公司|一九八六年十二月九日|
| 无网格|1999年1月10日|
| 生长激素|1987年1月15日|