Mysql 按天订购用户,直到生日

Mysql 按天订购用户,直到生日,mysql,date,Mysql,Date,我有一张桌子,上面有人和他们的出生日期。我想按到下一个生日的天数来选择它们 我已尝试使用DAYOFYEAR函数: SELECT id, DAYOFYEAR(datebirth)-DAYOFYEAR(NOW()) AS daystobd FROM users ORDER BY daystobd; 但是。。。如果今年的生日过了,我就要负一天了。这样做的目的是将这些列在最后 有什么想法吗 编辑:daystobd应该反映到下一个生日的实际天数 新编辑: 我设法用UNION做到了这一点,但我认为肯定有一

我有一张桌子,上面有人和他们的出生日期。我想按到下一个生日的天数来选择它们

我已尝试使用DAYOFYEAR函数:

SELECT id, DAYOFYEAR(datebirth)-DAYOFYEAR(NOW()) AS daystobd
FROM users ORDER BY daystobd;
但是。。。如果今年的生日过了,我就要负一天了。这样做的目的是将这些列在最后

有什么想法吗

编辑:daystobd应该反映到下一个生日的实际天数

新编辑:

我设法用UNION做到了这一点,但我认为肯定有一种更优雅的方式来做到这一点

SELECT id, DAYOFYEAR(datebirth)-DAYOFYEAR(CURDATE()) AS daystobd
FROM users WHERE DAYOFYEAR(datebirth)-DAYOFYEAR(CURDATE())>=0 
UNION
SELECT id, 365+DAYOFYEAR(datebirth)-DAYOFYEAR(CURDATE()) AS daystobd
FROM users WHERE DAYOFYEAR(datebirth)-DAYOFYEAR(CURDATE())<0 ORDER BY daystobd

比较今天的MMDD和用户的生日。然后用当前或下一年相应地构建下一个生日

SELECT
  id, 
  next_birthday,
  DATEDIFF(next_birthday, NOW()) AS daystobd
FROM
(
  SELECT
    id, 
    datebirth, 
    CASE WHEN DATE_FORMAT(datebirth, '%m%d') >= DATE_FORMAT(NOW(), '%m%d')
      THEN CONCAT(EXTRACT(YEAR FROM NOW()), '-', DATE_FORMAT(datebirth, '%m-%d'))
      ELSE CONCAT(EXTRACT(YEAR FROM NOW()) + 1, '-', DATE_FORMAT(datebirth, '%m-%d'))
    END AS next_birthday
  FROM users
) data
ORDER BY DATEDIFF(next_birthday, NOW());

如果低于0,给他们一个权重

ORDER BY CASE WHEN datstobd<0 THEN 1 ELSE 0 END,daystobd

按情况订购时datstobd@Mihai这并不能解决消极的daystobd。下一个出生日期应该是正值。。。但我想我已经找到了。。。让我们试试。我不得不彻底重新思考这个问题,当我注意到你不仅希望记录按天排序,直到下一个生日,而且还显示正确的天数。由于有些年份是闰年,有些年份不是,这不是一条直线,但在任何情况下都应该适用。