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

Тема в разделе "Базы данных", создана пользователем Slayter, 26 ноя 2007.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Slayter

    Slayter

    Регистр.:
    8 апр 2006
    Сообщения:
    232
    Симпатии:
    52
    Код:
    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 - по количеству дней оставшихся до ДР в восходящем порядке (те у кого ДР ближе расположены первыми).
     
    WebSpider нравится это.
  2. RomAndry

    RomAndry Постоялец

    Регистр.:
    21 ноя 2007
    Сообщения:
    102
    Симпатии:
    24
    Я бы еще дополнил "возрастом" именинников:
    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 текущая дата
     
  3. Slayter

    Slayter

    Регистр.:
    8 апр 2006
    Сообщения:
    232
    Симпатии:
    52
    Возраст вы правильно взяли в кавычки. Хоть подумали б прежде чем написать. Если человек родился третьего декабря 1989года, а сегодня второе, то в `age` уже сегодня будет 18.
     
  4. RomAndry

    RomAndry Постоялец

    Регистр.:
    21 ноя 2007
    Сообщения:
    102
    Симпатии:
    24
    угу, это ж у него в ближайшие 5 дней восемнадцатилетие =)
     
Статус темы:
Закрыта.