私が書いたら
select ename, to_char(hiredate,'fmDay') as "Day" order by "Day";
次に、次のように Day に基づいて結果を並べ替えます。金曜日、月曜日、先週の水曜日から、文字で並べ替えるように。
しかし、曜日で並べ替えたいのです。月曜日から日曜日まで。
私が書いたら
select ename, to_char(hiredate,'fmDay') as "Day" order by "Day";
次に、次のように Day に基づいて結果を並べ替えます。金曜日、月曜日、先週の水曜日から、文字で並べ替えるように。
しかし、曜日で並べ替えたいのです。月曜日から日曜日まで。
文字列で注文しているため、現在の順序で取得しています(何も選択していないため、これは機能しません)。
曜日を数値形式で作成するために使用される形式モデルで注文できますがD
、これでは日曜日が 1 であるmod()
ため、これを機能させるために を使用することをお勧めします。
つまり、テーブルを想定して
create table a ( b date );
insert into a
select sysdate - level
from dual
connect by level <= 7;
これはうまくいきます:
select mod(to_char(b, 'D') + 5, 7) as dd, to_char(b, 'DAY')
from a
order by mod(to_char(b, 'D') + 5, 7)
デモ用のSQL Fiddleを次に示します。
あなたの場合、クエリは次のようになります。
select ename, to_char(hiredate,'fmDay') as "Day"
from my_table
order by mod(to_char(hiredate, 'D') + 5, 7)
日付に対応する 1 ~ 7 の数字を持つ別の列を追加して、この列で並べ替えることができると、なぜ複雑になるのでしょうか...
の他のフォーマットを見てみましょうTO_CHAR
。「fmDay」の代わりに「D」を使用すると、1 から 7 までの曜日が表示されます。その後、簡単に並べ替えることができます。
日付形式のリストは次のとおりです: http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm
同じ要件に遭遇しました-クエリ結果を曜日で並べ替えますが、日曜日からではありません。Oracle で次のクエリを使用して月曜日から開始しました。(任意の曜日で注文を開始するように変更します。たとえば、'MONDAY' を 'TUESDAY' に変更します。)
SELECT ename, to_char(hiredate, 'fmDAY') AS "Day"
FROM emp
ORDER BY (next_day(hiredate, 'MONDAY') - hiredate) DESC
または:
SELECT ename, to_char(hiredate, 'fmDAY') AS "Day"
FROM emp
ORDER BY (hiredate - next_day(hiredate, 'MONDAY'))
答えを投稿するのが遅れるかもしれませんが、月曜日から始まる曜日でソートする簡単な解決策のようです。
select hiredate,dayname(hiredate) from emp order by (dayofweek(hiredate)+5)%7;
5 を追加した理由に対する回答
、数字では、日曜日の値は 1、月曜日の値は 2 ... で、土曜日の値は 7 であるためです。
したがって、2 + 5 = 7 と mod(%) with 7 により、月曜日から始まる新しい値が得られます。
この番号を変更して、他の曜日から開始することができます。