Mysql 按天订购用户,直到生日
我有一张桌子,上面有人和他们的出生日期。我想按到下一个生日的天数来选择它们 我已尝试使用DAYOFYEAR函数:Mysql 按天订购用户,直到生日,mysql,date,Mysql,Date,我有一张桌子,上面有人和他们的出生日期。我想按到下一个生日的天数来选择它们 我已尝试使用DAYOFYEAR函数: SELECT id, DAYOFYEAR(datebirth)-DAYOFYEAR(NOW()) AS daystobd FROM users ORDER BY daystobd; 但是。。。如果今年的生日过了,我就要负一天了。这样做的目的是将这些列在最后 有什么想法吗 编辑:daystobd应该反映到下一个生日的实际天数 新编辑: 我设法用UNION做到了这一点,但我认为肯定有一
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。下一个出生日期应该是正值。。。但我想我已经找到了。。。让我们试试。我不得不彻底重新思考这个问题,当我注意到你不仅希望记录按天排序,直到下一个生日,而且还显示正确的天数。由于有些年份是闰年,有些年份不是,这不是一条直线,但在任何情况下都应该适用。