2012-02-20 17 views
0

Oracleでは、日付、開始時刻が&の3つの列があり、次のように並べ替える必要があります。時間ベースの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'を参照していますか?私の解釈は、それが最初の文で言及された3つの列のうちの1つであるということでした。 –

4

「現在の時間」「SYSDATE」を意味し、「通常の昇順でソートされた」と仮定すると、あなたが何か他のものを意味する場合は、

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

のような何かができる「の昇順でのstart_timeでソート」を意味している場合いくつかのサンプルデータと期待される出力が間違いなく助けになるでしょう。

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句に隠しておくこともできます。

関連する問題