这是我当前的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查询中重新排序这些记录,以便它先显示当前月份和未来月份,然后显示明年月份?
多亏了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日(当然是明年):Mad Max
最佳答案
我不确定,但你的生日似乎包括这一年。如果是这样的话,每个用户都有一个生日范围(每年一个),你可以在接下来的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/