Lưu trữ các ngày lễ liên bang đó trong bảng ngày lễ dưới dạng DATE
nhập và thử một cái gì đó như sau:Tìm cái cũ nhất (MAX
) ngày trong bảy ngày cuối cùng của tháng không phải là thứ Bảy hoặc Chủ nhật cũng như ngày lễ được đề cập trong bảng ngày lễ.
Các giả định ở đây là 1) không phải tất cả bảy ngày cuối tháng đều có thể là ngày lễ hoặc cuối tuần và 2) Thứ Bảy và Chủ nhật được nghỉ. Bạn có thể điều chỉnh level
hoặc mệnh đề where phù hợp, tùy thuộc vào việc liệu giả định trên có luôn đúng hay không.
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 );
Một cách tiếp cận tốt hơn nhiều sẽ là có một bảng Lịch với tất cả các ngày trong năm và cột được xác định trước có tên là isbusinessday
. Sau đó, truy vấn sẽ đơn giản hơn nhiều.
SELECT MAX(dt)
FROM calendar
WHERE isbusinessday = 'Y'
AND TO_CHAR(dt,'YYYYMM') = TO_CHAR(SYSDATE,'YYYYMM');