Выборка дней рождений за 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 декабря.
almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.
Вы можете почитать все статьи от almix'а.
- 0 MySQL и PHP: Вычисление возраста (количество лет) по дате рождения (20.06.2017)
- 0 MySQL: проверить содержится ли значение в поле столбца (в столбце хранится строка значений через запятую) (22.05.2014)
- 0 MySQL: выбираем данные за период времени (за текущий месяц, за эту неделю..) (30.10.2013)
- 0 Php функция implode внутри запроса SELECT к MySQL. (02.09.2013)
- 0 Устанавливаем и настраиваем WampServer (аналог MAMP в Mac и возможная замена Denwer'у) на Windows (22.03.2013)
- 0 Полезные команды для вебразработчика (20.11.2017)
- MySQL: Как выбрать из таблицы строки, удовлетворяющие одновременно двум значениям колонки? (06.04.2017)
- MySQL ошибка: Unknown column 'table_name.id' in 'on clause' (06.04.2017)
- MySQL запрос приджойнивания с INNER JOIN 2-х таблиц к основной (18.11.2016)
- Как корректно вставить в MySQL текст с кавычками, используя PHP? (06.12.2012)
- Команды для сron job (для планировщика Cron на хостинге) (29.08.2012)
- Использование DISTINCT в SQL-запросах для исключения повторяющихся данных применительно к фреймворку CodeIgniter. (18.06.2012)
- Yii: MTreeView extension - расширение для формирования древовидного меню + немножко loco-магии (12.05.2012)
- ADD CONSTRAINT в MySQL (Ограничения внешних ключей) (24.08.2011)
- MySQL немного о JOIN'ах (24.08.2011)
- Выборка дней рождений за N ближайших дней в MySQL (24.08.2011) ← вы тут
- Конвертирование БД MySQL из кодировки latin1 или cp1251 и всех её данных в базу с данными в UTF-8 (24.08.2011)
1 комментарий
Спасибо! Решение, действительно, работает.
Однако для себя я немного скорректировал
1) условие
заменил начто позволяет использовать INTERVAL > месяца
2) условие
всегда истинно, поэтому его можно не писать.