उन संघीय छुट्टियों को छुट्टियों की तालिका में DATE
. के रूप में संग्रहीत करें टाइप करें और फिर कुछ इस तरह का प्रयास करें:सबसे पुराना खोजें ( MAX
) महीने के अंतिम सात दिनों में दिन जो न तो शनिवार या रविवार है और न ही छुट्टियों की तालिका में उल्लिखित छुट्टी है।
यहां धारणाएं हैं कि 1) महीने के अंत में सभी सात दिन सभी छुट्टियां या सप्ताहांत नहीं हो सकते हैं और 2) शनिवार और रविवार बंद हैं। आप level
को समायोजित कर सकते हैं या जहां खंड तदनुसार, इस पर निर्भर करता है कि उपरोक्त धारणा हमेशा सत्य होनी चाहिए या नहीं।
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');