Hvor NOW()
er et ikke-skudår 2011
, skyldes problemet, at enhver, der er født et skudår efter den 29. februar, vil have en ekstra dag, fordi du bruger DAYOFYEAR
mod fødselsåret.
DAYOFYEAR('2004-04-01') // DAYOFYEAR(e.birthdate) Returns 92
DAYOFYEAR('2011-04-01') // DAYOFYEAR(NOW()) Returns 91
Hvor du gør DAYOFYEAR
, skal du bruge fødselsdatoen fra det aktuelle år, ikke fødselsåret.
Så i stedet for:
DAYOFYEAR(e.birthdate)
Du kan konvertere det til i år på denne måde:
DAYOFYEAR(DATE_ADD(e.birthdate, INTERVAL (YEAR(NOW()) - YEAR(e.birthdate)) YEAR))
Hvilket konverterer en fødselsdato på:
'2004-04-01'
Til:
'2011-04-01'
Så her er den ændrede forespørgsel:
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))
Personer født den 29. februar falder den 1. marts i ikke-skudår, hvilket stadig er dag 60
.