これらの連邦祝日をDATE
として休日テーブルに保存します 次のように入力して試してください。最も古いものを検索します(MAX
)月の最後の7日間で、土曜日でも日曜日でも、休日の表に記載されている休日でもない日。
ここでの前提は、1)月末の7日間すべてが休日または週末になるわけではなく、2)土曜日と日曜日が休みであるということです。 level
を調整できます または、上記の仮定が常に当てはまるかどうかに応じて、それに応じてwhere句を使用します。
SELECT MAX(dt) AS last_working_day
FROM
(
SELECT last_day(SYSDATE) - level + 1 as dt
FROM dual CONNECT BY
level <= 7 -- the last seven days of the month
) WHERE TO_CHAR(dt,'DY', 'NLS_DATE_LANGUAGE = AMERICAN') NOT IN ('SAT','SUN')
AND dt NOT IN ( SELECT holiday from federal_holidays );
より良いアプローチは、その年のすべての日付とisbusinessday
と呼ばれる事前定義された列を含むカレンダーテーブルを作成することです。 。そうすれば、クエリははるかに簡単になります。
SELECT MAX(dt)
FROM calendar
WHERE isbusinessday = 'Y'
AND TO_CHAR(dt,'YYYYMM') = TO_CHAR(SYSDATE,'YYYYMM');