Simpan hari libur federal tersebut di tabel hari libur sebagai DATE
ketik dan coba sesuatu seperti ini:Temukan yang tertua ( MAX
) hari dalam tujuh hari terakhir bulan yang bukan hari Sabtu atau Minggu atau hari libur yang disebutkan dalam tabel hari libur.
Asumsinya disini adalah 1) tidak semua tujuh hari di akhir bulan semua bisa hari libur atau weekend dan 2) Sabtu dan Minggu libur. Anda dapat menyesuaikan level
atau di mana klausa yang sesuai, tergantung pada apakah asumsi di atas harus selalu benar atau tidak.
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 );
Pendekatan yang jauh lebih baik adalah memiliki tabel Kalender dengan semua tanggal dalam setahun dan kolom yang telah ditentukan sebelumnya yang disebut isbusinessday
. Maka kueri akan jauh lebih sederhana.
SELECT MAX(dt)
FROM calendar
WHERE isbusinessday = 'Y'
AND TO_CHAR(dt,'YYYYMM') = TO_CHAR(SYSDATE,'YYYYMM');