Où NOW()
est une année non bissextile 2011
, le problème vient du fait que toute personne née une année bissextile après le 29 février aura un jour supplémentaire car vous utilisez DAYOFYEAR
par rapport à l'année de naissance.
DAYOFYEAR('2004-04-01') // DAYOFYEAR(e.birthdate) Returns 92
DAYOFYEAR('2011-04-01') // DAYOFYEAR(NOW()) Returns 91
Où vous faites DAYOFYEAR
, vous avez besoin de la date de naissance de l'année en cours, pas de l'année de naissance.
Donc, au lieu de :
DAYOFYEAR(e.birthdate)
Vous pouvez le convertir en cette année comme ceci :
DAYOFYEAR(DATE_ADD(e.birthdate, INTERVAL (YEAR(NOW()) - YEAR(e.birthdate)) YEAR))
Ce qui convertit une date de naissance de :
'2004-04-01'
À :
'2011-04-01'
Voici donc la requête modifiée :
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))
Les personnes nées le 29 février tomberont le 1er mars des années non bissextiles, qui est toujours le jour 60
.