这是我当前的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/

10-14 06:53