2017-04-21 6 views
0

私は最近、米国の休日を返すOracleクエリを用意するように求められました。いくつかの研究をした後、私はこの点に関して何も見つけることができませんでした。見つかったソリューションのほとんどはC#またはVB用でした。Oracleクエリーで米国の休日を取得するには?

答えて

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

は、OracleからのビルドでSCHEDULER SCHEDULEを使用することができます。まず、あなたはここで、休日のスケジュールを作成する必要がありますいくつかの例は次のとおりです。

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

本当にあなたの組織のポリシーに依存します。私がJOBを作成するには、私のためにDBAを作成する必要があります。それは走り回っているようではありません! – yopez83

関連する問題