Oracle SQL を使用して、次の結果セットを作成するにはどうすればよいですか。
- 曜日の番号 (1 ~ 7)
- 曜日名(月曜日、火曜日、水曜日など)
例えば:
曜日名 1 月曜日 2 火曜日 3水曜日 4 木曜日 5 金曜日 6 土曜日 7 日曜日
フローリンの答えは私がどうするかということですが、NLSの設定には少し注意する必要があります。曜日はNLSの領域の影響を受けるため、米国にいるかのようにこれを実行すると、次のように機能します。
alter session set nls_territory = 'AMERICA';
select to_char(sysdate, 'D') as d, to_char(sysdate, 'Day') as day from dual;
D DAY
- ------------------------------------
6 Friday
select level as dow,
to_char(trunc(sysdate ,'D') + level, 'Day') as day
from dual
connect by level <= 7;
DOW DAY
--- ------------------------------------
1 Monday
2 Tuesday
3 Wednesday
4 Thursday
5 Friday
6 Saturday
7 Sunday
しかし、英国で実行されている同じクエリは休日です。
alter session set nls_territory = 'UNITED KINGDOM';
select to_char(sysdate, 'D') as d, to_char(sysdate, 'Day') as day from dual;
D DAY
- ------------------------------------
5 Friday
select level as dow,
to_char(trunc(sysdate ,'D') + level, 'Day') as day
from dual
connect by level <= 7;
DOW DAY
--- ------------------------------------
1 Tuesday
2 Wednesday
3 Thursday
4 Friday
5 Saturday
6 Sunday
7 Monday
...そして私はそれを修正するために計算を調整する必要があります:
select level as dow,
to_char(trunc(sysdate ,'D') + level - 1, 'Day') as day
from dual
connect by level <= 7;
DOW DAY
--- ------------------------------------
1 Monday
2 Tuesday
3 Wednesday
4 Thursday
5 Friday
6 Saturday
7 Sunday
必要に応じて、曜日の名前に使用する言語を個別に指定することもできます。
select level as dow,
to_char(trunc(sysdate ,'day') + level - 1, 'Day',
'NLS_DATE_LANGUAGE=FRENCH') as day
from dual
connect by level <= 7;
DOW DAY
--- --------------------------------
1 Lundi
2 Mardi
3 Mercredi
4 Jeudi
5 Vendredi
6 Samedi
7 Dimanche
グローバリゼーションサポートガイドのto_char()
withnls_date_language
と曜日などのドキュメント。
select level as dow,
to_char(level+trunc(sysdate,'D'),'Day') as day
from dual
connect by level <= 7;
変更セッションなし
CASE
WHEN to_char(sysdate, 'd')-1 = 0 THEN 7
ELSE to_char(sysdate, 'd')-1
END
Select 1, 'Monday' from dual union all select 2, 'Tuesday' from dual ...