Där NOW()
är ett icke-skottår 2011
, uppstår problemet från att alla som är födda ett skottår efter den 29 februari får en extra dag eftersom du använder DAYOFYEAR
mot födelseåret.
DAYOFYEAR('2004-04-01') // DAYOFYEAR(e.birthdate) Returns 92
DAYOFYEAR('2011-04-01') // DAYOFYEAR(NOW()) Returns 91
Där du gör DAYOFYEAR
, du behöver födelsedatumet från innevarande år, inte födelseåret.
Så istället för:
DAYOFYEAR(e.birthdate)
Du kan konvertera det till i år så här:
DAYOFYEAR(DATE_ADD(e.birthdate, INTERVAL (YEAR(NOW()) - YEAR(e.birthdate)) YEAR))
Som konverterar ett födelsedatum för:
'2004-04-01'
Till:
'2011-04-01'
Så här är den ändrade frågan:
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ödda den 29 februari kommer att infalla den 1 mars under icke-skottår, vilket fortfarande är dag 60
.