Выборка дней рождений за N ближайших дней в MySQL
Одним запросом необходимо выбрать из MySql-таблицы все предстоящие дни рождения за n дней. Дата хранится в формате: YYYY-MM-DD.
Задача на первый взгляд тривиальная, но готового и короткого решения сразу не нашел. Вот работоспособный запрос!
Дальше в OR – условие определяющее, что текущая дата и текущая дата + 15 принадлежат не одному году
После AND идёт условие определяющее, что текущая дата + 15 больше даты рождения хранящейся в базе.
Дальше снова в OR – условие определяющее, что дата рождения, хранящаяся в базе, больше текущей даты, но меньше 31 декабря.
Задача на первый взгляд тривиальная, но готового и короткого решения сразу не нашел. Вот работоспособный запрос!
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 декабря.
Из года в год этот код ходит .... статье уже 5 лет .... http://pitin.su/news-63-100-0.htm
ОтветитьУдалитьДа на авторство я и не претендую :) Написано же - чтобы не ломать голову и не искать потом
ОтветитьУдалитьэтот запрос глючит с датой 01.01.XXXX
ОтветитьУдалитьесли мы , например , еще в YY.12.XXXX