2017-04-21 46 views

回答

1

我在下面分享查詢。請記住,在某些州,您可能會有更多的假期,但我只想通過列出最相關的內容來保留它。

/* 
    New Year's Day -------------- January 1st 
    Martin Luther King, Jr. ----- Third Monday in January 
    Washington's Birthday ------- Third Monday in February 
    Memorial Day ---------------- Last Monday in May 
    Independence Day ------------ July 4th 
    Labor Day ------------------- First Monday in September 
    Columbus Day ---------------- Second Monday in October 
    Veterans Day ---------------- November 11 
    Thanksgiving Day ------------ Fourth Thursday in November 
    Christmas Day --------------- December 25th 
*/ 

SELECT NEXT_DAY(TRUNC(SYSDATE, 'YYYY') - 1, 'MONDAY') FROM DUAL UNION 
SELECT NEXT_DAY(TRUNC(SYSDATE, 'YYYY') - 1, 'MONDAY') + 14 FROM DUAL UNION 
SELECT NEXT_DAY(ADD_MONTHS(TRUNC(SYSDATE, 'YYYY'), 1) - 1, 'MONDAY') + 14 FROM DUAL UNION 
SELECT NEXT_DAY(ADD_MONTHS(TRUNC(SYSDATE, 'YYYY'), 5) - 1, 'MONDAY') - 7 FROM DUAL UNION 
SELECT ADD_MONTHS(TRUNC(SYSDATE,'YYYY'),6) + 3 FROM DUAL UNION 
SELECT NEXT_DAY(ADD_MONTHS(TRUNC(SYSDATE,'YYYY'),8), 'MONDAY') FROM DUAL UNION 
SELECT NEXT_DAY(ADD_MONTHS(TRUNC(SYSDATE,'YYYY'),9) - 1, 'MONDAY') + 7 FROM DUAL UNION 
SELECT ADD_MONTHS(TRUNC(SYSDATE,'YYYY'),10) + 10 FROM DUAL UNION 
SELECT NEXT_DAY(ADD_MONTHS(TRUNC(SYSDATE, 'YYYY'), 10) - 1, 'THURSDAY') + 21 FROM DUAL UNION 
SELECT ADD_MONTHS(TRUNC(SYSDATE,'YYYY'),11) + 24 FROM DUAL; 
2

您可以使用集結在SCHEDULER SCHEDULE從Oracle。首先,你必須創建假期時間表,這裏有一些例子:

BEGIN 

    DBMS_SCHEDULER.CREATE_SCHEDULE('NEW_YEARS_DAY', repeat_interval => 'FREQ=YEARLY;INTERVAL=1;BYDATE=0101'); 
    DBMS_SCHEDULER.CREATE_SCHEDULE('MARTIN_LUTHER_KING_DAY', repeat_interval => 'FREQ=MONTHLY;BYMONTH=JAN;BYDAY=3 MON', comments => 'Third Monday of January'); 
    DBMS_SCHEDULER.CREATE_SCHEDULE('WASHINGTONS_BIRTHDAY', repeat_interval => 'FREQ=MONTHLY;BYMONTH=FEB;BYDAY=3 MON', comments => 'Third Monday of February'); 
    DBMS_SCHEDULER.CREATE_SCHEDULE('MEMORIAL_DAY', repeat_interval => 'FREQ=MONTHLY;BYMONTH=MAY;BYDAY=-1 MON', comments => 'Last Monday of May'); 
    DBMS_SCHEDULER.CREATE_SCHEDULE('INDEPENDENCE_DAY', repeat_interval => 'FREQ=YEARLY;INTERVAL=1;BYDATE=0704'); 
    DBMS_SCHEDULER.CREATE_SCHEDULE('CHRISTMAS_DAY', repeat_interval => 'FREQ=YEARLY;INTERVAL=1;BYDATE=1225'); 
    DBMS_SCHEDULER.CREATE_SCHEDULE('SPRING_BREAK', repeat_interval => 'FREQ=YEARLY;BYDATE=0301+SPAN:7D'); 

    DBMS_SCHEDULER.CREATE_SCHEDULE('ALL_HOLIDAYS', repeat_interval => 'FREQ=DAILY;INTERSECT=CHRISTMAS_DAY,INDEPENDENCE_DAY,MARTIN_LUTHER_KING_DAY,MEMORIAL_DAY,NEW_YEARS_DAY,SPRING_BREAK,WASHINGTONS_BIRTHDAY'); 

END; 

在這裏看到日曆語法:下一頁紀念天:Calendaring Syntax

然後你就可以用DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING

例詢問他們

DECLARE 
    start_time TIMESTAMP := TRUNC(LOCALTIMESTAMP); 
    next_run_date TIMESTAMP := start_time; 
BEGIN 
    DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING('MEMORIAL_DAY', NULL, next_run_date, next_run_date); 
    DBMS_OUTPUT.PUT_LINE (next_run_date); 
END; 

例如:全部holid今年AYS

DECLARE 
    start_time TIMESTAMP := TIMESTAMP '2016-12-31 00:00:00'; 
    next_run_date TIMESTAMP := start_time; 
BEGIN 
    LOOP 
     DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING('ALL_HOLIDAYS', NULL, next_run_date, next_run_date); 
     EXIT WHEN next_run_date > TIMESTAMP '2017-12-31 00:00:00'; 
     DBMS_OUTPUT.PUT_LINE (next_run_date); 
    END LOOP; 
END; 

例如:下一個10個華盛頓的生日

DECLARE 
    start_time TIMESTAMP := TRUNC(LOCALTIMESTAMP); 
    next_run_date TIMESTAMP := start_time; 
BEGIN 
    FOR i IN 1..10 LOOP 
     DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING('WASHINGTONS_BIRTHDAY', NULL, next_run_date, next_run_date); 
     DBMS_OUTPUT.PUT_LINE (next_run_date); 
    END LOOP; 
END; 
+0

根據您上面提供的日曆語法文檔中的規則和限制,當你SYS解決方案是理想的。因此,它是DBA最適合的解決方案,但不適用於db用戶。無論如何,我會upvote你的答案,因爲它以某種方式解決問題。 – yopez83

+0

它爲什麼需要SYS權限?它表示「只有SYS可以在SYS模式中執行任何操作」,但是您可以在自己的模式中創建計劃,您只需要'CREATE JOB'特權,請參閱[使用說明](http://docs.oracle.com/cd /B19306_01/appdev.102/b14258/d_sched.htm#sthref5542)。 –

+0

這確實取決於你組織的政策。對於我創建一個作業,我需要一個DBA爲我創建它。這不像跑步和瞧! – yopez83

相關問題