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
.