2014-09-25 80 views
0

经过一段时间的搜索,我发现没有“好”的解决方案来从MySQL数据库即将到来的生日只有一个单一的选择语句。我在网络上发现了许多不同的策略,但没有一个在特别是一年的变化中工作得很好。优雅的方式来选择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'); 

的结果将是所有即将到来的生日(也如果生日是一年以后的变化)的列表。

+0

你能解释一下你的情况下即将到来的生日吗? – Jens 2014-09-25 06:11:25

+0

您好Jens,在我的情况下,这意味着我想要检索会员(用户)的生日将是NOW()的下一个相对位置。 – 2014-09-25 06:23:39

+0

如果你知道接下来可以使用bewteen来比较日期:'select * from rs_mem where mem_dateBirth and now()order by mem_dateBirth' – Jens 2014-09-25 06:26:46

回答

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

希望这会帮助你。

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 
+0

嗨Abides,感谢您的评论 - 不幸的是,你会得到任何结果,因为'mem_dateBirth> CURDATE()'将来会在寻找生日。 – 2015-02-07 07:11:32