fc2ブログ

(元)社内SEの徒然なる日記

SQL(Oracle)で土日と祝日をそれっぽく考慮した日付一覧の作成

■ 土日祝日考慮の日付一覧

随分前に、SQLOracle)で日付の連続データを作成する方法を記事にしました(SQL(Oracle)で日付の連続データを作成する)。

今回は、それに加えて土日、祝日を除去した日付の連続データを作成してみました。SQLは、こんな感じです。

-- 日付の連番(リスト)を作るSQL
WITH V_CALENDAR AS
(
SELECT
TO_DATE('20150401', 'YYYYMMDD') + ROWNUM - 1 AS 日付
,SUBSTR(TO_CHAR(
TO_DATE('20150401', 'YYYYMMDD') + ROWNUM - 1, 'YYYYMMDD')
, 5, 7) AS 月日
,TO_CHAR(
TO_DATE('20150401', 'YYYYMMDD') + ROWNUM - 1
, 'D') AS 曜日
FROM
ALL_CATALOG
WHERE
TO_DATE('20150401', 'YYYYMMDD') + ROWNUM - 1
<= TO_DATE('20170809', 'YYYYMMDD')
)

-- 日付の連番(リスト)から、土日と指定日を除く
SELECT
TO_CHAR(日付, 'YYYYMMDD') AS 日付
FROM
V_CALENDAR
WHERE
-- "2"(月曜日)〜 "6"(金曜日)
曜日 BETWEEN 2 AND 6

-- 正月とお盆を除く期間を抽出
AND ( 月日 BETWEEN '0104' AND '0813'
OR 月日 BETWEEN '0817' AND '1228'
)
-- 祝日を除く
AND 月日 <>'0211' -- 2月11日 は除く(建国記念日)
AND 月日 <>'0320' -- 3月20日 は除く(春分の日)
AND 月日 <>'0503' -- 5月 3日 は除く(憲法記念日)
AND 月日 <>'0504' -- 5月 4日 は除く(みどりの日)
AND 月日 <>'0505' -- 5月 5日 は除く(こどもの日)
AND 月日 <>'0529' -- 5月29日 は除く(昭和の日)
AND 月日 <>'0717' -- 7月17日 は除く(海の日) 正確には7月第3月曜日
AND 月日 <>'0811' -- 8月11日 は除く(山の日)
AND 月日 <>'0918' -- 9月18日 は除く(敬老の日)正確には9月の第3月曜日
AND 月日 <>'0923' -- 9月23日 は除く(秋分の日)
AND 月日 <>'1009' -- 10月 9日 は除く(体育の日)正確には10月の第2月曜日
AND 月日 <>'1103' -- 11月 3日 は除く(文化の日)
AND 月日 <>'1123' -- 11月23日 は除く(勤労感謝の日)
AND 月日 <>'1223' -- 12月23日 は除く(天皇誕生日)
ORDER BY 1


■ 解説

まず、WITH句で指定した範囲の日付一覧を作成します。この部分の詳細は、以前の記事(SQL(Oracle)で日付の連続データを作成する)に書いています。

次に土日の判定。TO_CHAR関数で日付書式(引数の2番目)を D とすると、曜日を数値化してくれます。これで日付を数値化。この数値は、日曜日が 1、月曜日が2 といった感じでなので、月曜日 〜 金曜日までの範囲だけを抽出すれば、土日が除去されます。

祝日の方は、日付から月日を取得して、正月、お盆、祝日を対象外にしています。

注意点は、この方法だと、祝日については正確に取得できないってこと。SQLのコメントにも書いていますが、判定条件が月日なので、**月の第**曜日 というルールの祝日は日付が異なります。

ですが、今回私が使いたかった要件では、そこまで厳密な休日考慮は必要ないので、まぁ、別に良いかなと。

■ 後書き

祝日まで考慮した日付一覧が必要であれば、PL/SQLを使う、上記のSQLで年を考慮した条件を設定する、SQL以外の手法を組みあわせるという工夫が必要だと思います。

これを作った目的は、いつか書いた在庫の発注勧告システム(今度の開発案件は在庫の発注サポートシステム No1 構想)のための、発注日から商品が納品されるまでの差日数の計算のためです。ただの日差じゃなく、営業日で考えないとならないので、土日祝日を除外したカレンダーが欲しかったのです。

問題なのは、この祝日の判定は相手によって異なるということ。土曜日の営業の有無や、お盆や正月の休み期間の違いなど、各社ごとに変わります。それに商品を受取る方も、勤め先では倉庫業務を一部外注しているので、外注先によっては営業日(倉庫の稼働日)が変わります。

そこまでのカレンダーは現実的に作れないので、まぁ、それっぽい値になれば良いかなってことです。

最新の記事:http://harikofu.blog.fc2.com/
投稿記事の一覧:http://harikofu.web.fc2.com/

--- blog end ---
スポンサードリンク

PageTop

コメント


管理者にだけ表示を許可する