社内SEの話

日々起きたことの記録用

【Oracle】SQLでWORKDAYを実装してみる

↓プログラミングで副業を考えたらこちら↓

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 <= :日数

sql workday

試しに日数を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のパッケージなどに登録するとより便利に使えるようになると思います。