Выборка дней рождений за N ближайших дней в MySQL

Нет картинки

Одним запросом необходимо выбрать из MySql-таблицы все предстоящие дни рождения за n дней. Дата хранится в формате: YYYY-MM-DD.

Задача на первый взгляд тривиальная, но готового и короткого решения сразу не нашел. Вот работоспособный запрос!

SELECT
birthdays_name
FROM
si_birthdays
WHERE
(
date_format(now()+interval 15 day,'%m-%d')>date_format(birthdays_date,'%m-%d')
AND date_format(NOW(),'%m-%d')<date_format(birthdays_date,'%m-%d')
)
OR
(date_format(NOW()+interval 15 day,'%m')='01'
AND date_format(NOW(),'%m')='12'
AND 
   (
   date_format(NOW()+interval 15 day,'%m-%d')>date_format(birthdays_date,'%m-%d') 
   OR
      (
      date_format(NOW(),'%m-%d')<date_format(birthdays_date,'%m-%d')
      AND '12-31'>=date_format(birthdays_date,'%m-%d')
      )
    )
)
ORDER BY birthdays_date ASC

В первом WHERE - условие  выборки дней рождений для большинства случаев (всех кроме тех, когда текущая дата и текущая дата + 15 принадлежат не одному году). Условие определяет, что дата рождения, хранящаяся в базе, больше текущей даты, но меньше текущей даты + 15.

Дальше в OR – условие определяющее, что текущая дата и текущая дата + 15 принадлежат не одному году

После AND идёт условие определяющее, что текущая дата + 15  больше даты рождения хранящейся в базе.

Дальше снова в OR – условие определяющее, что дата рождения, хранящаяся в базе, больше текущей даты, но меньше 31 декабря.

 

Источник: www.pitin.su

almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.

Вы можете почитать все статьи от almix'а.



Другие статьи по этой теме:

Комментарии (1)     Подпишитесь на RSS комментариев к этой статье.

1 комментарий

#882
Anup говорит:
May 27, 2013 at 03:26 am

Спасибо! Решение, действительно, работает.

Однако для себя я немного скорректировал

1) условие

date_format(NOW()+interval 15 day,'%m')='01'
AND date_format(NOW(),'%m')='12'
заменил на

DATE_FORMAT(CURDATE(), '%m-%d') > DATE_FORMAT(CURDATE() + INTERVAL 1 DAY, '%m-%d')
что позволяет использовать INTERVAL > месяца

2) условие

'12-31'>=date_format(birthdays_date,'%m-%d')
всегда истинно, поэтому его можно не писать.