3

次のクエリでは、うるう年は考慮されていません。

 SELECT      e.id,
             e.title,
             e.birthdate
 FROM        employers e
 WHERE       DAYOFYEAR(curdate()) <= DAYOFYEAR(e.birthdate)
 AND         DAYOFYEAR(curdate()) +14 >= DAYOFYEAR(e.birthdate)

したがって、このクエリでは、うるう年に生まれた人の誕生日は、うるう年以外の年とは異なる曜日になっています。

うるう年でも機能するようにクエリを調整するにはどうすればよいですか?

私が持っているmysqlのバージョンは次のとおりです:5.0.67

4

3 に答える 3

9

NOW()うるう年以外の場合2011、2月29日以降のうるう年に生まれた人はDAYOFYEAR、誕生年に対して使用しているため、余分な日があります。

DAYOFYEAR('2004-04-01') // DAYOFYEAR(e.birthdate) Returns 92
DAYOFYEAR('2011-04-01') // DAYOFYEAR(NOW()) Returns 91

その場合DAYOFYEAR、生年月日ではなく、現在の年の生年月日が必要です。

したがって、代わりに:

DAYOFYEAR(e.birthdate)

次のように今年に変換できます。

DAYOFYEAR(DATE_ADD(e.birthdate, INTERVAL (YEAR(NOW()) - YEAR(e.birthdate)) YEAR))

これは、次の誕生日を変換します。

'2004-04-01'

に:

'2011-04-01'

したがって、変更されたクエリは次のとおりです。

SELECT      e.id,
             e.title,
             e.birthdate
 FROM        employers e
 WHERE       DAYOFYEAR(curdate()) <= DAYOFYEAR(DATE_ADD(e.birthdate, INTERVAL (YEAR(NOW()) - YEAR(e.birthday)) YEAR))
 AND         DAYOFYEAR(curdate()) +14 >= DAYOFYEAR(DATE_ADD(e.birthdate, INTERVAL (YEAR(NOW()) - YEAR(e.birthday)) YEAR))

2月29日に生まれた人は、うるう年ではない3月1日に落ち60ます。

于 2012-03-14T14:15:27.827 に答える
1

平年は365日、うるう年は366日です。通常の年では、3月1日はその年の60日目になります。うるう年では、2月29日はその年の60日目になります。MySQL関数は一貫しています。

本当に必要以上に複雑にしたい場合は、3月1日以上でうるう年でない場合に1日を追加できますDAYOFYEAR(curdate())。しかし、私はそれをすることをお勧めしません。curdate()curdate()

于 2012-03-14T14:10:54.310 に答える
1

これが関連する解決策です

PHPとMYSQLを使用して今日祝っている友達の誕生日を見つける方法 celebrating-today-using-php-and-mysq

私が正しく理解していれば、あなたが抱えている問題は、あなたの誕生日が3月1日である場合、その年の(n番目の)60日を探しているので、時々間違った日を取得しているということです。

上記のソリューションのクエリは問題に対処していると思います

于 2012-03-14T14:16:28.500 に答える