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