Управление запросами. 5 ближайших дней рождений!

Статус
В этой теме нельзя размещать новые ответы.

Slayter

Гуру форума
Регистрация
8 Апр 2006
Сообщения
231
Реакции
55
Код:
SELECT *,
DATEDIFF(CAST(CONCAT('2007-',DATE_FORMAT(`date_of_birth` '%m-%d')) AS DATE), NOW()) as `diff`
 FROM `persona`
WHERE
 DATEDIFF(CAST(CONCAT('2007-',DATE_FORMAT(`date_of_birth`,'%m-%d'))AS DATE), NOW()) >= 0
ORDER BY `diff`
ASC
LIMIT 0, 5;
CAST - приведение типов (чтобы не было ворнинга на конкат типа DATE к типу timestamp)
CONCAT - присоединение. т.е. в итоге получаем 2007-05-16 от поля date_of_birth где хранится, например 1989-16-05. Текущий год лучше подсовывать в запрос в скрипте. а не делать DATE_FORMAT(NOW(),"%Y"). по-крайней мере я так советую.
Таблица `persona` - таблица в которой у вас хранится инфа по юзерам.
Поле `date_of_birth` типа DATE.
В столбце `diff` будет содержаться кол-во дней до дня рождения.

С помощью данного запроса мы получаем ближайшие 5 дней рождений у наших пользователей. Сортируем по столбцу diff - по количеству дней оставшихся до ДР в восходящем порядке (те у кого ДР ближе расположены первыми).
 
Я бы еще дополнил "возрастом" именинников:
SELECT *,
DATEDIFF(CAST(CONCAT('2007-',DATE_FORMAT(`date_of_birth` '%m-%d')) AS DATE), NOW()) as `diff`,
(YEAR(CURRENT_DATE)-YEAR(`date_of_birth`)) as `age`
FROM `persona`
WHERE
DATEDIFF(CAST(CONCAT('2007-',DATE_FORMAT(`date_of_birth`,'%m-%d'))AS DATE), NOW()) >= 0
ORDER BY `diff`
ASC
LIMIT 0, 5;

где CURRENT_DATE текущая дата
 
Возраст вы правильно взяли в кавычки. Хоть подумали б прежде чем написать. Если человек родился третьего декабря 1989года, а сегодня второе, то в `age` уже сегодня будет 18.
 
угу, это ж у него в ближайшие 5 дней восемнадцатилетие =)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху