使用MySQL选择即将到来的生日的优雅方式

使用MySQL选择即将到来的生日的优雅方式,mysql,mysqli,Mysql,Mysqli,在搜索了一段时间后,我发现没有一个好的解决方案可以通过一条select语句从MySQL数据库中获取即将到来的生日。我在网络上发现了许多不同的策略,但没有一种效果很好,尤其是在今年的变化中 现在我想分享我的最终解决方案: SELECT mem_id, mem_dateBirth, MONTH(mem_dateBirth), DAY(mem_dateBirth) FROM rs_mem WHERE mem_dateBirth IS NOT NULL AND mem_dateBirth

在搜索了一段时间后,我发现没有一个好的解决方案可以通过一条select语句从MySQL数据库中获取即将到来的生日。我在网络上发现了许多不同的策略,但没有一种效果很好,尤其是在今年的变化中

现在我想分享我的最终解决方案:

SELECT mem_id, mem_dateBirth, MONTH(mem_dateBirth), DAY(mem_dateBirth)
FROM rs_mem
WHERE mem_dateBirth IS NOT NULL AND 
      mem_dateBirth > '1900-01-01'
ORDER BY (date_format(NOW(), '%m%d') >= date_format(mem_dateBirth, '%m%d')),
         date_format(mem_dateBirth, '%m%d');

如果生日在年份更改之后,结果将是一个包含所有即将到来的生日的列表。

您的查询很好,下面是另一种使用案例语句对结果排序的方法:

SELECT M.mem_id
     , M.mem_dateBirth
     , MONTH(mem_dateBirth) AS month
     , DAY(mem_dateBirth) AS day
FROM rs_mem M
WHERE IFNULL(M.mem_dateBirth, '1900-01-01') > '1900-01-01'
ORDER BY CASE
           WHEN DATE_FORMAT(M.mem_dateBirth, '%m%d') >= DATE_FORMAT(NOW(), '%m%d') THEN 1
           ELSE 0
         END DESC, date_format(mem_dateBirth, '%m%d');
我还修改了WHERE子句,以便缩短IFNULL的使用时间


希望这将对您有所帮助。

MSSQL:TOP 10是前10条记录,您可以删除所有记录

SELECT TOP 10 mem_id, mem_dateBirth, MONTH(mem_dateBirth), DAY(mem_dateBirth)
FROM rs_mem
WHERE mem_dateBirth IS NOT NULL AND 
      mem_dateBirth > '1900-01-01' AND
      mem_dateBirth > DATE()
ORDER BY mem_dateBirth
SELECT mem_id, mem_dateBirth, MONTH(mem_dateBirth), DAY(mem_dateBirth)
    FROM rs_mem
    WHERE NOT isnull(mem_dateBirth) AND 
          mem_dateBirth > '1900-01-01' AND
          mem_dateBirth > CURDATE()
    ORDER BY mem_dateBirth limit 0,10
MYSQL:limit 0,10是前10条记录,可以删除所有记录

SELECT TOP 10 mem_id, mem_dateBirth, MONTH(mem_dateBirth), DAY(mem_dateBirth)
FROM rs_mem
WHERE mem_dateBirth IS NOT NULL AND 
      mem_dateBirth > '1900-01-01' AND
      mem_dateBirth > DATE()
ORDER BY mem_dateBirth
SELECT mem_id, mem_dateBirth, MONTH(mem_dateBirth), DAY(mem_dateBirth)
    FROM rs_mem
    WHERE NOT isnull(mem_dateBirth) AND 
          mem_dateBirth > '1900-01-01' AND
          mem_dateBirth > CURDATE()
    ORDER BY mem_dateBirth limit 0,10

你能解释一下即将到来的生日在你的上下文中意味着什么吗?嗨,Jens,在我的上下文中,这意味着我想检索其生日将是下一个相对于现在的成员用户。如果你知道下一个是什么,你可以用bewteen来比较日期:选择*from rs_mem where mem_dateBirth between and NOW按mem_dateBirth排序谢谢,但是会是什么呢?我只想从现在开始过接下来的20个生日。如果你在查询中考虑一年,你会得到一个问题,因为你不能简单地使用一个日期比较,因为生日是在过去的事实。现在清楚了下一步意味着什么。在我的理解中,“下一个”也可以指“下一个10天”或“下一个10天”之类的事情。在您的情况下,您也可以使用:select*from rs\u mem where birth>=now order by mem\u date出生限制20Hi,谢谢您的评论-不幸的是,您不会得到任何结果,因为'mem\u dateBirth>CURDATE'正在寻找未来的生日。