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