我需要使用 Oracle DBA Scheduler 安排程式在每個月的第 4 個作業日運行(不包括銀行假日和周末)。經過一些研究后,Oracle DBA 調度程式似乎無法識別作業日或銀行假日。
我提出了以下兩個想法:
安排另一個程式在每個月的 1 日運行并檢查何時是第 4 個作業日,并調整第一個計劃作業中的 repeat_interval 使其在第 4 個作業日運行。
安排作業每月運行,但僅在前 7 天運行,并在運行程序中創建檢查今天是否是第 4 個作業日,如果是,則執行,否則不運行。
我沒有太多安排作業的經驗,所以我不確定是否推薦選項 1,但它似乎更容易。我想選項 2 仍然可以,但完成會更耗時。
你會使用什么選項?或者也許是完全不同的東西?
謝謝
uj5u.com熱心網友回復:
您可以在一年中的每個月的第 4 個作業日生成 SQL。您應該獲得實際年份的假期日期。
示例:
捷克共和國 2022 年公共假期
| 日期 | 天 | 假期 |
|---|---|---|
| 01.01.2022 | 星期六 | 元旦 |
| 15.04.2022 | 周五 | 耶穌受難日 |
| 2022 年 4 月 18 日 | 星期一 | 復活節星期一 |
| 01.05.2022 | 太陽 | 勞動節 |
| 08.05.2022 | 太陽 | 解放日 |
| 05.07.2022 | 周二 | 圣西里爾和圣美多德日 |
| 06.07.2022 | 星期三 | 揚胡斯日 |
| 28.09.2022 | 星期三 | 建國日 |
| 28.10.2022 | 周五 | 獨立日 |
| 2022 年 11 月 17 日 | 周四 | 自由與民主日 |
| 24.12.2022 | 星期六 | 平安夜 |
| 25.12.2022 | 太陽 | 圣誕節 |
| 26.12.2022 | 星期一 | 圣誕節的第二天 |
創建一個 CTE假期和另一個名為days的 CTE,包含 365 天的某些屬性,例如星期幾、是否是作業日以及一個月內的作業日和非作業日的不同計數器:
WITH
holidays AS
(
Select To_Date('01.01.2022', 'dd.mm.yyyy') "A_DATE", 'New Year''s Day' "A_NAME" From Dual Union All
Select To_Date('15.04.2022', 'dd.mm.yyyy') "A_DATE", 'Good Friday ' "A_NAME" From Dual Union All
Select To_Date('18.04.2022', 'dd.mm.yyyy') "A_DATE", 'Easter Monday' "A_NAME" From Dual Union All
Select To_Date('01.05.2022', 'dd.mm.yyyy') "A_DATE", 'May Day ' "A_NAME" From Dual Union All
Select To_Date('08.05.2022', 'dd.mm.yyyy') "A_DATE", 'Liberation Day' "A_NAME" From Dual Union All
Select To_Date('05.07.2022', 'dd.mm.yyyy') "A_DATE", 'St Cyril and St Methodius Day' "A_NAME" From Dual Union All
Select To_Date('06.07.2022', 'dd.mm.yyyy') "A_DATE", 'Jan Hus Day' "A_NAME" From Dual Union All
Select To_Date('28.09.2022', 'dd.mm.yyyy') "A_DATE", 'Statehood Day' "A_NAME" From Dual Union All
Select To_Date('28.10.2022', 'dd.mm.yyyy') "A_DATE", 'Independence Day' "A_NAME" From Dual Union All
Select To_Date('17.11.2022', 'dd.mm.yyyy') "A_DATE", 'Freedom and Democracy Day' "A_NAME" From Dual Union All
Select To_Date('24.12.2022', 'dd.mm.yyyy') "A_DATE", 'Christmas Eve ' "A_NAME" From Dual Union All
Select To_Date('25.12.2022', 'dd.mm.yyyy') "A_DATE", 'Christmas Day' "A_NAME" From Dual Union All
Select To_Date('26.12.2022', 'dd.mm.yyyy') "A_DATE", '2nd Day of Christmas ' "A_NAME" From Dual
),
days AS
( Select
To_Date('01.01.' || To_Char(SYSDATE, 'yyyy'), 'dd.mm.yyyy') (LEVEL - 1) "DATE_ID",
To_Char(To_Date('01.01.' || To_Char(SYSDATE, 'yyyy'), 'dd.mm.yyyy') (LEVEL - 1), 'DY') "DAY_OF_WEEK",
CASE
WHEN To_Char(To_Date('01.01.' || To_Char(SYSDATE, 'yyyy'), 'dd.mm.yyyy') (LEVEL - 1), 'DY') NOT IN('SAT', 'SUN') And
To_Date('01.01.' || To_Char(SYSDATE, 'yyyy'), 'dd.mm.yyyy') (LEVEL - 1) Not IN(Select A_DATE From holidays)
THEN 'YES'
ELSE '-'
END "WRKDAY",
Count(*) OVER(Partition By To_Char(To_Date('01.01.' || To_Char(SYSDATE, 'yyyy'), 'dd.mm.yyyy') (LEVEL - 1), 'yyyymm') ||
CASE
WHEN To_Char(To_Date('01.01.' || To_Char(SYSDATE, 'yyyy'), 'dd.mm.yyyy') (LEVEL - 1), 'DY') NOT IN('SAT', 'SUN') And
To_Date('01.01.' || To_Char(SYSDATE, 'yyyy'), 'dd.mm.yyyy') (LEVEL - 1) Not IN(Select A_DATE From holidays)
THEN 'YES'
ELSE '-'
END
Order By To_Date('01.01.' || To_Char(SYSDATE, 'yyyy'), 'dd.mm.yyyy') (LEVEL - 1)) "DAY_NUM"
From
Dual
Connect By
LEVEL <= 365
Order By
LEVEL
)
現在您可以獲得 2022 年所有感興趣的日期:
Select
DATE_ID, DAY_OF_WEEK, WRKDAY, DAY_NUM
From
days
Where
WRKDAY = 'YES' And DAY_NUM = 4
Order By
DATE_ID
結果是:
| DATE_ID | DAY_OF_WEEK | 作業日 | DAY_NUM |
|---|---|---|---|
| 22 年 1 月 6 日 | 周四 | 是的 | 4 |
| 22 年 2 月 4 日 | 周五 | 是的 | 4 |
| 04-MAR-22 | 周五 | 是的 | 4 |
| 06-APR-22 | 星期三 | 是的 | 4 |
| 22 年 5 月 5 日 | 周四 | 是的 | 4 |
| 06-JUN-22 | 星期一 | 是的 | 4 |
| 22 年 7 月 8 日 | 周五 | 是的 | 4 |
| 22 年 8 月 4 日 | 周四 | 是的 | 4 |
| 06-SEP-22 | 周二 | 是的 | 4 |
| 06-10-22 | 周四 | 是的 | 4 |
| 22 年 11 月 4 日 | 周五 | 是的 | 4 |
| 06-DEC-22 | 周二 | 是的 | 4 |
此資料集現在可用于您想要的任何調度策略。您只需要檢查您的實際日期是否在其中列出,或者您可以使用這些日期來指示調度程式。
問候...
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/532694.html
