Нужно отсортировать запрос по разнице дат без учета года. Проще говоря, выдать список людей, у которых день рождения в ближайшие Х дней, отсортированный по дням рождения. Туплю. Есть идеи?
Берем дату добавляем интервал, дальше ищем всех у кого день и месяц совпали с полученной датой. Какие еще нужны идеи? DATEDIFF и иже с ними, там функций на все случаи жизни.
найти не проблема, проблема в сортировке. Через пару дней новый год, есть три человека, один родился 31.12, второй 3.01, третий 29.12 надо чтобы вывелось именно в этом порядке, потому что ближайшее 29.12 наступит толкьо в следующем году.
мгм. придумал же ты. Во-первых, 29.12 к тебе в список попасть не должен. [sql]SELECT day as D, month as M, (CASE DATE(30.12.0) < DATE(D.M.0) THEN 1 ELSE 0 END) AS Y FROM table ORDER BY DATEFORMAT(DATE(D, M, Y), 'yyyy-mm-dd')[/sql] как-то так. За имена функций и корректность синтаксиса не ручаюсь Ну и, возможно, потребуется подзапрос, чтобы распознался Y в ORDER BY Вместо 0 можешь использовать текущий год. Тогда в THEN будет CURYEAR() +1, а в ELSE CURYEAR()
[sql]select name, date_b from table where date_b between sysdate and sysdate+x order by date_b[/sql] Как то так. И год как раз нужне для правильной сортировки. Ндеюсь что в таблице дата рождения хранится именно как дата, а не в каком нибудь извращенном виде.
Goryn Это не будет работать. Ему нужна не сортировка по году рождения, а по близости ДР в текущем интервале.
Simpliest Угу, примерно так и придется, видимо. Странно, я думал это довольно распространенная задача, и у нее должно быть простое решение. А вот хрен мне, видимо. Спасибо.
Ну и какая разница, я храню день и месяц по отдельности или храню DATE и прямо в запросе дергаю TO_CHAR(users.birthday, 'mm') и TO_CHAR(users.birthday, 'dd') ?
Alost Поясняю еще раз. Ему надо не на основании дня и месяца. А на основании разницы между текущей датой и днем рождения на определенном промежутке времени посмотри 3е сообщение в топике, там пример дат есть.
SELECT b.*, IF(b.birthday_month < {ТЕКУЩИЙ МЕСЯЦ}, 0, 1) AS prior FROM birthdays WHERE {НУЖНЫЕ ДНИ} ORDER BY prior DESC, b.birthday_month ASC, b.birthday_day ASC
Dr.Death текущая дата 20 декабря любого года. Дни рождения 19 и 21 декабря соответственно. у тебя и 19 и 21 будут идти друг за другом. А надо чтобы 19 было самым последним, а 21 самым первым
ничего не мешает добавить еще одну сортировку на текущий месяц и текущее число, если нужен дурацкий вывод декабрь - январь - дыра - декабрь
Dr.Death А теперь еще учти, что дата хранится в одном поле, а не в 3х А логика в выподе, как ни странно, есть
Допустим в базе a_user есть поля фамилия имя и дата рождения F, I, datar, тогда выбрать именинников в ближайшие 30 дней с сортировкой без учета года можно так: Код (Text): SELECT F, I, datar, DATE_FORMAT(datar,'%m') as datarm, DATE_FORMAT(datar,'%d') as datard FROM a_user WHERE DATE_FORMAT(datar, CONCAT(YEAR(NOW()),'-%m-%d')) BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 30 DAY) ORDER BY datarm, datard; Суть в том, что в выборке формируем поля месяца и дат отдельно через as и уже по ним сортируем. Однако некорректно работает на границе года, скажем в период декабрь-январь.