一定期間内に誕生日を控えている人のリストを取得しようとしているときに、いくつかの問題に遭遇する可能性があります。
うるう年がある場合、あなたが持っている条件がうるう年のケースを処理できない可能性があります。次の問題は今日のようなもので2016-12-30
、次の 7 日間は b'days が必要です。したがって、期間の終わりは年2017
です。この場合、いくつかの条件が失敗します。これらは非常に重要なテスト ケースです。
このスレッドで修正されたもののほとんどはDAYOFYEAR()
、うるう年にあるときに失敗する を使用しています。
例えば。
DAYOFYEAR('2016-03-01 00:00:00')
です61
。
DAYOFYEAR('2015-03-01 00:00:00')
は60
一番シンプルで分かりやすい方法がこれです。
- ユーザーの次の b'day を計算します。
- 次に、その日が範囲内にあるかどうかを確認します。
これはうるう年でも機能し、日付の範囲は 2 年にまたがります。
SELECT *
FROM `PERSONS`
WHERE
/*
Here we calculate the next coming b'day for user
and check if it is between our span
*/
CONCAT(IF(
CONCAT( YEAR(CURDATE()), substring(`BIRTHDAY`, 5, length(`BIRTHDAY`))) < CURDATE(),
YEAR(CURDATE()) + 1, /* Adds an year if already past */
YEAR(CURDATE()) /* Use this year if it is upcoming */
), substring(`BIRTHDAY`, 5, length(`BIRTHDAY`)))
BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL @tot DAY)
PS: また、誕生日に基づいてこれらを注文したい場合にも最適なソリューションです。これをフィールドとして追加するだけです。