次の月曜日、火曜日、〜曜日を求める、次の週初めを求める
⇒ LAST_DAY 関数
NEXT_DAY ( datetime , session_day_name] )
NEXT_DAY ( datetime , session_day_index] ) ← マニュアルには表記がない
return [ DATE ]
datetime | 基準となる日付式 | |
local_day_name | 曜日の名前 | |
local_day_index | 週初めからの日数 | |
NEXT_DAY 関数の内容
基準となる日付式 datetime の翌日(当日は含まない)以後の日で で指定した曜日 session_day_name の日付を取得する。
session_day_name は NLS_LANGUAGE の影響を受けるため JAPANESE でのデフォルトでは英語表記ではなく '日曜日'〜'土曜日'(土曜といった省略形でも可) で指定する。
NLS_LANGUAGE は言語環境を設定するパラメータであるが 日付の言語を指定するための NLS 初期化パラメータ NLS_DATE_LANGUAGE もあり NLS_LANGUAGE の日付表記の設定を上書きできる。
週初めからの日数 local_day_index による形式
local_day_index の引数形式では カレンダの先頭の曜日から 1〜 7 までを指定する。
NLS_TERRITORY = 'JAPAN' において 1 は日曜日、7 は土曜日になる。
月曜日が週初めの国も存在する。NLS_TERRITORY = 'GERMAN' (ドイツなど)
使用箇所の注意:マニュアルには表記がないのでプログラムに使用するのは控えるようにしたい。
日付言語を ENGLISH に変更
SQL> alter session set NLS_DATE_LANGUAGE='english';
SQL> select NEXT_DAY(DATE '2000-01-01', 'monday') next_mon from dual;
NEXT_MON
-------------------
2000-01-03 00:00:00
SQL> select NEXT_DAY(DATE '2000-01-01', 'sat') next_sat from dual;
NEXT_SAT
-------------------
2000-01-08 00:00:00
日付言語を JAPANESE に変更
SQL> alter session set NLS_DATE_LANGUAGE='japanese';
SQL> select NEXT_DAY(DATE '2000-01-01', '月曜日') next_mon from dual;
NEXT_MON
-------------------
2000-01-03 00:00:00
SQL> select NEXT_DAY(DATE '2000-01-01', '土曜') next_sat from dual;
NEXT_SAT
-------------------
2000-01-08 00:00:00
先週のある曜日の日付を取得する PREV_DAY ファンクション
P_DATE より前の P_DAY で指定した曜日での日付を戻す関数
CREATE OR REPLACE FUNCTION RIVUS.PREV_DAY( P_DATE IN DATE, P_DAY IN CHAR )
RETURN DATE
IS
BEGIN
RETURN NEXT_DAY(P_DATE - 8, P_DAY);
END;
週のはじまりとは日曜日? 月曜日?
ISO 規格(ISO 8601)での週とは、一週間は月曜(第一日)に始まり、日曜(第七日)で終わる。と定義されている。
そのため日本でも月曜始まりのカレンダがあるため、少なからず混乱している(※)といえる。
ちなみに辞書を引くと、 日曜日:週の第一日 と記されているし、現在のところ、Oracle 的にも日本での週初めは日曜日ということになっているようである。
(※) 少しネットで調べてみたところ、結構多くのコミュニティで質問や議論されていた。週明け、ウィークエンドなど言葉が混乱に拍車をかけているようである。
参考:日付から曜日の名前を取得する
ISO 週の起算日を求める
select trunc(NEXT_DAY(trunc(current_date,'YYYY')-1, '木曜日'), 'IW') from dual; --(※1)
-- または
select trunc(trunc(current_date,'YYYY')+3, 'IW') from dual; -- (※2)
-- または
select trunc(current_date, 'IYYY') from dual; -- (※3)
(※1) ISO の第1週は、「その年の初めの木曜日がある週」の定義を素直に式にしたもの。
NEXT_DAY には NLS パラメータを指定できないためセッションの日付言語で指定しなければならない。
CURRENT_DATE が 年末で翌年の第1週であっても「今年」の ISO の第1週の日付になる。
(※2) 1月4日の週は必ず ISO の第1週に含まれる事から導いたもの。
(※3) ISO 年の切り捨て。但し CURRENT_DATE 値が 年末で翌年の第1週に含まれる場合は 「翌年」の ISO の第1週の日付が戻される。
SQL 関数 - NEXT_DAY 関連