Kde NOW()
je nepřestupný rok 2011
, problém vzniká tak, že kdokoli narozený v přestupném roce po 29. únoru bude mít o den navíc, protože používáte DAYOFYEAR
proti roku narození.
DAYOFYEAR('2004-04-01') // DAYOFYEAR(e.birthdate) Returns 92
DAYOFYEAR('2011-04-01') // DAYOFYEAR(NOW()) Returns 91
Kde děláte DAYOFYEAR
, potřebujete datum narození z aktuálního roku, nikoli rok narození.
Takže místo:
DAYOFYEAR(e.birthdate)
Na letošní rok to můžete převést takto:
DAYOFYEAR(DATE_ADD(e.birthdate, INTERVAL (YEAR(NOW()) - YEAR(e.birthdate)) YEAR))
Což převede datum narození:
'2004-04-01'
Komu:
'2011-04-01'
Takže zde je upravený dotaz:
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))
Lidé narození 29. února připadnou na 1. březen v nepřestupném roce, což je stále den 60
.