Oracle SQL 関数 : NEXT_DAY : 指定日以降の最初の指定曜日の日付計算
dateRet := NEXT_DAY( dateSrc, charSrc ); NEXT_DAY は 日付dataSrc 以降の指定曜日の最初の日付(DATE型)を返します。 (指定日から見て、翌週の指定曜日の日付を取得します) 指定曜日charSrc は「日曜日」「月曜日」「火曜日」「水曜日」「木曜日」「金曜日」「土曜日」 または、短縮文字列「日」「月」「火」「水」「木」「金」「土」で指定します。
SQL> SELECT
2 TO_CHAR( NEXT_DAY(TO_DATE('2000/02/01'), '日曜日' ), 'YYYY/MM/DD') AS NORMALSUN
3 ,TO_CHAR( NEXT_DAY(TO_DATE('2000/02/01'), '月曜日' ), 'YYYY/MM/DD') AS NORMALMON
4 ,TO_CHAR( NEXT_DAY(TO_DATE('2000/02/01'), '火曜日' ), 'YYYY/MM/DD') AS NORMALTUE
5 ,TO_CHAR( NEXT_DAY(TO_DATE('2000/02/01'), '水曜日' ), 'YYYY/MM/DD') AS NORMALWED
6 ,TO_CHAR( NEXT_DAY(TO_DATE('2000/02/01'), '木曜日' ), 'YYYY/MM/DD') AS NORMALTHU
7 ,TO_CHAR( NEXT_DAY(TO_DATE('2000/02/01'), '金曜日' ), 'YYYY/MM/DD') AS NORMALFRI
8 ,TO_CHAR( NEXT_DAY(TO_DATE('2000/02/01'), '土曜日' ), 'YYYY/MM/DD') AS NORMALSAT
9 FROM DUAL;
NORMALSUN NORMALMON NORMALTUE NORMALWED
-------------------- -------------------- -------------------- --------------------
NORMALTHU NORMALFRI NORMALSAT
-------------------- -------------------- --------------------
2000/02/06 2000/02/07 2000/02/08 2000/02/02
2000/02/03 2000/02/04 2000/02/05
この例では、曜日の指定を長い文字列で指定し2000年2月1日(火曜日)からみて、一番近い各曜日の日付を取得しています。 以下の例では、曜日の指定を短縮形の指定にしています。
SQL> SELECT
2 TO_CHAR( NEXT_DAY(TO_DATE('2000/02/01'), '日' ), 'YYYY/MM/DD') AS SHORTSUN
3 ,TO_CHAR( NEXT_DAY(TO_DATE('2000/02/01'), '月' ), 'YYYY/MM/DD') AS SHORTMON
4 ,TO_CHAR( NEXT_DAY(TO_DATE('2000/02/01'), '火' ), 'YYYY/MM/DD') AS SHORTTUE
5 ,TO_CHAR( NEXT_DAY(TO_DATE('2000/02/01'), '水' ), 'YYYY/MM/DD') AS SHORTWED
6 ,TO_CHAR( NEXT_DAY(TO_DATE('2000/02/01'), '木' ), 'YYYY/MM/DD') AS SHORTTHU
7 ,TO_CHAR( NEXT_DAY(TO_DATE('2000/02/01'), '金' ), 'YYYY/MM/DD') AS SHORTFRI
8 ,TO_CHAR( NEXT_DAY(TO_DATE('2000/02/01'), '土' ), 'YYYY/MM/DD') AS SHORTSAT
9 FROM DUAL;
SHORTSUN SHORTMON SHORTTUE SHORTWED
-------------------- -------------------- -------------------- --------------------
SHORTTHU SHORTFRI SHORTSAT
-------------------- -------------------- --------------------
2000/02/06 2000/02/07 2000/02/08 2000/02/02
2000/02/03 2000/02/04 2000/02/05
日付指定のところですが、曜日の文字列では無く、各曜日に対応したインデックス値でもできる様です。 この方法はあまり推奨はしてない様ですが。
SQL> SELECT
2 TO_CHAR( NEXT_DAY(TO_DATE('2000/02/01'), 1 ), 'YYYY/MM/DD') AS SUN
3 ,TO_CHAR( NEXT_DAY(TO_DATE('2000/02/01'), 2 ), 'YYYY/MM/DD') AS MON
4 ,TO_CHAR( NEXT_DAY(TO_DATE('2000/02/01'), 3 ), 'YYYY/MM/DD') AS TUE
5 ,TO_CHAR( NEXT_DAY(TO_DATE('2000/02/01'), 4 ), 'YYYY/MM/DD') AS WED
6 ,TO_CHAR( NEXT_DAY(TO_DATE('2000/02/01'), 5 ), 'YYYY/MM/DD') AS THU
7 ,TO_CHAR( NEXT_DAY(TO_DATE('2000/02/01'), 6 ), 'YYYY/MM/DD') AS FRI
8 ,TO_CHAR( NEXT_DAY(TO_DATE('2000/02/01'), 7 ), 'YYYY/MM/DD') AS SAT
9 FROM DUAL;
SUN MON TUE WED
-------------------- -------------------- -------------------- --------------------
THU FRI SAT
-------------------- -------------------- --------------------
2000/02/06 2000/02/07 2000/02/08 2000/02/02
2000/02/03 2000/02/04 2000/02/05