次の月曜日、火曜日、〜曜日を求める、次の週初めを求める

LAST_DAY 関数

syntax

NEXT_DAY ( datetime , session_day_name] )
NEXT_DAY ( datetime , session_day_index] ) ← マニュアルには表記がない
return [ DATE ]

parameter

datetime基準となる日付式
local_day_name曜日の名前
local_day_index週初めからの日数

return

  • 指定した曜日の日付 (DATE 型)

avail

  • SQL および PL/SQL の両方で使用可能。

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 関連

 
アルファベット別 関数一覧 ショートカット
ABCDEFG
HILMNOP
RSTUVWX
日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ 会員制(無料)の公式技術サイト