DatabaseでExcel関数のWORKDAYと同じ結果を返す方法
Excelで便利なWORKDAY関数をSQLで再現する方法を紹介します。
前提条件
平日と休日の情報のテーブルを用意してもらいます。
カレンダーテーブルがないとWORKDAYが実装できないので注意してください。
select '2024-03-18' as YMD ,1 as DAYTYPE from DUAL
YMD:日付
DAYTYPE:平日1 休日:2
で実装します
今回は仮想テーブルで検証するのでサブクエリを作成しておきます。
SQL
with Calendar as ( select '2024-03-18' as YMD ,1 as DAYTYPE from DUAL union all select '2024-03-19' as YMD ,1 as DAYTYPE from DUAL union all select '2024-03-20' as YMD ,2 as DAYTYPE from DUAL union all -- 春分の日 select '2024-03-21' as YMD ,1 as DAYTYPE from DUAL union all select '2024-03-22' as YMD ,1 as DAYTYPE from DUAL union all select '2024-03-23' as YMD ,2 as DAYTYPE from DUAL union all --土曜日 select '2024-03-24' as YMD ,2 as DAYTYPE from DUAL union all --日曜日 select '2024-03-25' as YMD ,1 as DAYTYPE from DUAL ) select max(ymd) from ( select YMD from Calendar where YMD >= '2024-03-18' and DAYTYPE = 1 order by YMD ) where rownum <= :日数
試しに日数を5にして実行してみました。
2024-03-25と正しい結果が返って来ました。
やっていること
select YMD from Calendar where YMD >='2024-03-18' and DAYTYPE = 1 order by YMD
平日だけを抽出します。
もし今日の日付が欲しい場合はSYSDATEにしてあげます
where rownum <= :日数
Oracle以外のLimitで解決するんですが、OracleにはLimitがないので、擬似的Limitとして副問合せからのROWNUMを使っています。
max(ymd)
ここまでで、SYSDATEから日数分が抽出されたので、最大値を返せば休日を除いたWORKDAYと同じ動きができます。
まとめ
この方法が良ければ、DBのパッケージなどに登録するとより便利に使えるようになると思います。