2014-09-25 24 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