Mysql
 sql >> Database >  >> RDS >> Mysql

Mysql Dayofyear nell'anno bisestile

Dove NOW() è un anno non bisestile 2011 , il problema nasce dal fatto che chi è nato in un anno bisestile dopo il 29 febbraio avrà un giorno in più perché stai usando DAYOFYEAR contro l'anno di nascita.

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

Dove fai DAYOFYEAR , è necessaria la data di nascita dell'anno in corso, non l'anno di nascita.

Quindi, invece di:

DAYOFYEAR(e.birthdate)

Puoi convertirlo a quest'anno in questo modo:

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

Che converte una data di nascita di:

'2004-04-01'

A:

'2011-04-01'

Quindi, ecco la query modificata:

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

Le persone nate il 29 febbraio cadranno il 1 marzo negli anni non bisestili, che è ancora il giorno 60 .