За последние 24 часа нас посетили 22184 программиста и 1057 роботов. Сейчас ищут 700 программистов ...

как отсортировать?

Тема в разделе "Oracle Database", создана пользователем karakh, 30 дек 2009.

  1. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Нужно отсортировать запрос по разнице дат без учета года. Проще говоря, выдать список людей, у которых день рождения в ближайшие Х дней, отсортированный по дням рождения. Туплю. Есть идеи?
     
  2. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Берем дату добавляем интервал, дальше ищем всех у кого день и месяц совпали с полученной датой.
    Какие еще нужны идеи?

    DATEDIFF и иже с ними, там функций на все случаи жизни.
     
  3. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    найти не проблема, проблема в сортировке. Через пару дней новый год, есть три человека, один родился 31.12, второй 3.01, третий 29.12 надо чтобы вывелось именно в этом порядке, потому что ближайшее 29.12 наступит толкьо в следующем году.
     
  4. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    мгм.
    придумал же ты.

    Во-первых, 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()
     
  5. Goryn

    Goryn Активный пользователь

    С нами с:
    4 апр 2006
    Сообщения:
    398
    Симпатии:
    0
    Адрес:
    Ярославль
    [sql]select name, date_b
    from table where
    date_b between sysdate and sysdate+x
    order by date_b[/sql]
    Как то так. И год как раз нужне для правильной сортировки. Ндеюсь что в таблице дата рождения хранится именно как дата, а не в каком нибудь извращенном виде.
     
  6. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Goryn
    Это не будет работать.
    Ему нужна не сортировка по году рождения, а по близости ДР в текущем интервале.
     
  7. Goryn

    Goryn Активный пользователь

    С нами с:
    4 апр 2006
    Сообщения:
    398
    Симпатии:
    0
    Адрес:
    Ярославль
    Да, был не прав. Не внимательно читал..... Терь дошло. Будем думать.
     
  8. Alost

    Alost Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    в базе разделить дату рождения на состовляющие.
     
  9. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Зачем? я и так могу в любой момент вытащить из даты составляющие.
     
  10. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Simpliest
    Угу, примерно так и придется, видимо.
    Странно, я думал это довольно распространенная задача, и у нее должно быть простое решение. А вот хрен мне, видимо.
    Спасибо.
     
  11. Alost

    Alost Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    karakh
    Чтоб сортировка ближайших ДР делалась на основании числа и месяца.
     
  12. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Ну и какая разница, я храню день и месяц по отдельности или храню DATE и прямо в запросе дергаю TO_CHAR(users.birthday, 'mm') и TO_CHAR(users.birthday, 'dd') ?
     
  13. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Alost
    Поясняю еще раз. Ему надо не на основании дня и месяца.
    А на основании разницы между текущей датой и днем рождения на определенном промежутке времени

    посмотри 3е сообщение в топике, там пример дат есть.
     
  14. Dr.Death

    Dr.Death Активный пользователь

    С нами с:
    26 янв 2010
    Сообщения:
    3
    Симпатии:
    0
    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
     
  15. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Dr.Death
    текущая дата 20 декабря любого года.
    Дни рождения 19 и 21 декабря соответственно.

    у тебя и 19 и 21 будут идти друг за другом.
    А надо чтобы 19 было самым последним, а 21 самым первым :)
     
  16. Dr.Death

    Dr.Death Активный пользователь

    С нами с:
    26 янв 2010
    Сообщения:
    3
    Симпатии:
    0
    ничего не мешает добавить еще одну сортировку на текущий месяц и текущее число, если нужен дурацкий вывод декабрь - январь - дыра - декабрь
     
  17. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Dr.Death
    А теперь еще учти, что дата хранится в одном поле, а не в 3х :)

    А логика в выподе, как ни странно, есть :)
     
  18. Dr.Death

    Dr.Death Активный пользователь

    С нами с:
    26 янв 2010
    Сообщения:
    3
    Симпатии:
    0
    из одного поля не проблема достать месяц, день, год :D
     
  19. Ember

    Ember Новичок

    С нами с:
    22 ноя 2014
    Сообщения:
    2
    Симпатии:
    0
    Допустим в базе a_user есть поля фамилия имя и дата рождения F, I, datar, тогда выбрать именинников в ближайшие 30 дней с сортировкой без учета года можно так:
    Код (Text):
    1. 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 и уже по ним сортируем.

    Однако некорректно работает на границе года, скажем в период декабрь-январь.