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

时间:2014-09-25 06:07:10

标签: 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 > '1900-01-01'
ORDER BY (date_format(NOW(), '%m%d') >= date_format(mem_dateBirth, '%m%d')),
         date_format(mem_dateBirth, '%m%d');

结果将是包含所有即将到来的生日的列表(如果生日是在年度更改之后也是如此)。

2 个答案:

答案 0 :(得分:0)

您的查询没问题,这是使用CASE语句订购结果的另一种方法:

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)。

希望这会对你有所帮助。

答案 1 :(得分:0)

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

MYSQL:限制0,10是前10条记录,你可以删除所有记录。

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