Если NOW()
- это не високосный год 2011
, проблема возникает у любого, кто родился в високосный год после 29 февраля, будет иметь дополнительный день, потому что вы используете DAYOFYEAR
против года рождения.
DAYOFYEAR('2004-04-01') // DAYOFYEAR(e.birthdate) Returns 92
DAYOFYEAR('2011-04-01') // DAYOFYEAR(NOW()) Returns 91
Если вы делаете DAYOFYEAR
, вам нужна дата рождения текущего года, а не года рождения.
Итак, вместо:
DAYOFYEAR(e.birthdate)
Вы можете преобразовать его в этот год следующим образом:
DAYOFYEAR(DATE_ADD(e.birthdate, INTERVAL (YEAR(NOW()) - YEAR(e.birthdate)) YEAR))
Что конвертирует дату рождения:
'2004-04-01'
Кому:
'2011-04-01'
Итак, вот модифицированный запрос:
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))
Люди, родившиеся 29 февраля, падут 1 марта на не високосные годы, которые по-прежнему являются днем 60
.