这是我当前的 sql 查询,它获取我公司在未来 90 天内所有即将到来的生日:
SELECT
user.birthday, user.name, MONTH(user.birthday)
AS month, DAY(user.birthday) AS day
FROM user WHERE
(1 =
(FLOOR(DATEDIFF(DATE_ADD(DATE(NOW()),INTERVAL
90 DAY),birthday) / 365.25)) -
(FLOOR(DATEDIFF(DATE(NOW()),birthday)
/ 365.25)))
ORDER BY MONTH(birthday),DAY(birthday)
问题是,如果现在是 11 月,并且有一些生日在 1 月,它将首先显示 1 月的生日,然后是 11 月和 12 月,尽管今年 1 月的生日已经发生了。
有没有办法在同一个 SQL 查询中重新排序这些记录,以便它首先显示当前和 future 的月份,然后是下一年的月份?
第一个部分解决方案 感谢 Johan
ORDER BY ( MONTH(birthday) > MONTH(NOW()
OR ((MONTH(birthday) = MONTH(now())
AND DAY(birthday) >= DAY(NOW()) DESC
, MONTH(birthday), DAY(birthday)
仍然需要一点改进。如果生日已经发生,则应在 12 月之后显示在结果中。假设是 6 月 27 日应该显示的示例
- 6 月 28 日:john doe
- 12 月 27 日:玛丽·赖特
- 6 月 5 日(当然是明年):疯狂的麦克斯
最佳答案
我不确定,但您的生日似乎包括年份。如果是这样,您将为每个用户设置一个生日范围(每年一个),您可以只选择接下来 90 天内的生日。
SELECT
user.birthday
, user.name
, MONTH(user.birthday) AS month
, DAY(user.birthday) AS day
FROM user
WHERE birthday BETWEEN NOW() AND DATE_ADD(NOW, INTERVAL 90 DAY)
ORDER BY Birthday DESC
如果你的生日只有月份和日期,你的查询需要是:
SELECT
user.birthday
, user.name
, MONTH(user.birthday) AS month
, DAY(user.birthday) AS day
FROM user
WHERE STR_TO_DATE(CONCAT(YEAR(NOW()),MONTH(birthday),DAY(birthday)),'%YYYY%M%D')
BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 90 DAY) OR
STR_TO_DATE(CONCAT(YEAR(DATE_ADD(NOW(),INTERVAL 1 YEAR)),MONTH(birthday),DAY(birthday)),'%YYYY%M%D')
BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 90 DAY)
ORDER BY ( MONTH(birthday) > MONTH(NOW()
OR ((MONTH(birthday) = MONTH(now()) AND DAY(birthday) >= DAY(NOW()) DESC,
MONTH(birthday), DAY(birthday)
关于mysql - 即将到来的生日年错误 (SQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6453943/