Mysql Dayofyear в високосный год - PullRequest
3 голосов
/ 14 марта 2012

В следующем запросе високосный год не учитывается.

 SELECT      e.id,
             e.title,
             e.birthdate
 FROM        employers e
 WHERE       DAYOFYEAR(curdate()) <= DAYOFYEAR(e.birthdate)
 AND         DAYOFYEAR(curdate()) +14 >= DAYOFYEAR(e.birthdate)

Таким образом, в этом запросе дата рождения того, кто родился в високосный год, имеет другой день в не високосный год.

Как настроить запрос, чтобы он также работал в високосный год?

У меня есть версия mysql: 5.0.67

Ответы [ 3 ]

8 голосов
/ 14 марта 2012

Если 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.

1 голос
/ 14 марта 2012

Вот соответствующее решение

Как найти День рождения ДРУЗЕЙ, которые празднуют сегодня, используя PHP и MYSQL празднуя-сегодня-используя-PHP-и-mysq

Если я правильно понимаю, проблема в том, что если у вас день рождения 1 марта, поскольку вы ищете (n-й) 60-й день в году, вы иногда ошибаетесь.

Я полагаю, что запрос в приведенном выше решении решает проблему

1 голос
/ 14 марта 2012

В нормальном году 365 дней, в високосном - 366.В обычном году 1 марта будет 60-м днем ​​года.В високосный год 29 февраля будет 60-м днем ​​года.Функция MySQL непротиворечива.

Если вы действительно хотели бы сделать его более сложным, чем нужно, вы можете добавить день к своему DAYOFYEAR(curdate()), если curdate() большеили равно 1 марта, а curdate() не в високосный год.Но я бы не рекомендовал это делать.

...