Gdzie NOW()
nie jest rokiem przestępnym 2011
, problem wynika z tego, że każdy urodzony rok przestępny po 29 lutego będzie miał dodatkowy dzień, ponieważ używasz DAYOFYEAR
w stosunku do roku urodzenia.
DAYOFYEAR('2004-04-01') // DAYOFYEAR(e.birthdate) Returns 92
DAYOFYEAR('2011-04-01') // DAYOFYEAR(NOW()) Returns 91
Gdzie robisz DAYOFYEAR
, potrzebujesz daty urodzenia z bieżącego roku, a nie z roku urodzenia.
Więc zamiast:
DAYOFYEAR(e.birthdate)
Możesz go przekonwertować na ten rok w ten sposób:
DAYOFYEAR(DATE_ADD(e.birthdate, INTERVAL (YEAR(NOW()) - YEAR(e.birthdate)) YEAR))
Który konwertuje datę urodzenia:
'2004-04-01'
Do:
'2011-04-01'
Oto zmodyfikowane zapytanie:
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))
Osoby urodzone 29 lutego upadną 1 marca w roku innym niż przestępny, czyli nadal jest dniem 60
.