2012-02-20 4 views
0

Я пытаюсь выполнить сортировку другого типа в Oracle. У меня есть три столбца: Date, Start Time & End Time, и мне нужно отсортировать столбец следующим образом.Сортировка столбца в Oracle на основе времени

Если текущее время находится в промежутке между временем начала и временем окончания, тогда эта строка должна появиться @ сверху. В противном случае ее следует отсортировать по нормальному возрастанию.

Сейчас мой запрос выглядит следующим образом

select * from details order by date,start_time 

Как я могу принять текущее время во внимание при сортировке?

ответ

4

Первая мысль, которая пришла мне в голову:

SELECT * 
FROM details 
ORDER BY (CASE WHEN date_column BETWEEN start_time AND end_time THEN 0 ELSE 1 END) 
     , date_column 
     , start_time; 
+0

Blimey, я не могу набрать достаточно быстро. Является ли текущее время вопросом на самом деле 'SYSDATE' или' CURRENT_DATE'? Моя интерпретация заключалась в том, что это один из трех столбцов, упомянутых в первом предложении. –

4

Если «текущее время» означает «SYSDATE», и предполагая, что «сортируется по обычному порядку возрастания» означает «сортировку по start_time в порядке возрастания» вы могли бы сделать что-то вроде

SELECT * 
    FROM details 
ORDER BY (CASE WHEN sysdate BETWEEN start_time AND end_time 
       THEN 1 
       ELSE 0 
      END) desc, 
      start_time asc 

Если вы имеете в виду что-то другое , некоторые выборочные данные и ожидаемый результат определенно помогут.

1

Возможно, вам потребуется настроить синтаксис в Oracle, но концепция должна применяться.

SELECT d.*, 
     CASE WHEN sysdate BETWEEN Start_Time AND End_Time THEN 0 ELSE 1 END SortKey 
    FROM Details 
ORDER BY SortKey, Date, Start_Time; 

В принципе, это создает столбец, который искусственно группирует результаты по мере их сортировки. Это может быть ценная техника. Мне нравится видеть критерии сортировки - по крайней мере, во время отладки - поэтому я поместил его в список SELECT. Вы также можете сохранить его скрытым только в предложении ORDER BY, если хотите.