2012-03-14 1 views
3

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

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

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

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

версия MySQL я имею: 5.0.67

+0

хорошо, думал сначала вы пытались претендовать на ошибку в 'функций DAYOFYEAR'. Итак, разумеется, 'DAYOFYEAR' отличается в високосный год. Вам нужно объяснить, почему это проблема. – Alnitak

+0

Что именно вы пытаетесь выполнить с помощью этого запроса? –

+1

Определить работы. Конечно, DayOfYear отличается в високосный год, в нем еще один день. –

ответ

7

Где 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.

1

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

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

+0

Я не сказал, что функция непоследовательна. прочитайте мой комментарий к моему стартовому сообщению! – sanders

1

Вот похожее решение

How to find the Birthday of FRIENDS Who are celebrating today using PHP and MYSQL празднуя-сегодня-используя-PHP-и-mysq

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

Я считаю, что запрос в приведенном выше решении рассматривается вопрос