Где 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'
To:
'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
.
хорошо, думал сначала вы пытались претендовать на ошибку в 'функций DAYOFYEAR'. Итак, разумеется, 'DAYOFYEAR' отличается в високосный год. Вам нужно объяснить, почему это проблема. – Alnitak
Что именно вы пытаетесь выполнить с помощью этого запроса? –
Определить работы. Конечно, DayOfYear отличается в високосный год, в нем еще один день. –