我最近被要求提出一個返回美國假期的Oracle查詢。在做了一些研究之後,我在這方面找不到任何東西。大部分解決方案都是針對C#或VB的。如何通過Oracle查詢獲得美國假期?
0
A
回答
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;
相關問題
- 1. 檢測美國假期
- 2. 如何通過IP地址在美國獲得時區?
- 3. 獲得美國國家
- 4. Excel假設日期爲美國格式
- 5. 獲得通過MySQL查詢
- 6. 如何獲得所選國家的國定假日
- 7. 如何通過通過城市和國家獲得時區?
- 8. Oracle組通過查詢
- 9. 如何通過日期獲得匯率?
- 10. 通過CloudMade獲取美國州的幾何座標
- 11. Parse.com通過查詢獲得價值
- 12. 公共假期檢查員(英國)
- 13. 如何通過JSON數組獲得價值如查詢
- 14. 大熊貓假期日曆規則美國選舉日
- 15. 兩個日期不同,美國節假日除外
- 16. DBpedia SPARQL查詢美國大學
- 17. D3.js加載美國通過SVG
- 18. 想通過java轉換美國格式的日期
- 19. 如何美國日期格式轉換爲MYSQL格式INSERT查詢
- 20. MVC 4如何通過客戶端驗證驗證非美國日期?
- 21. 如何通過MySQL查詢使用BirthDate列獲得年齡?
- 22. 如何獲得通過多meta_value與SQL查詢POST_ID
- 23. 如何通過使用CMIS查詢獲得1000多個文檔
- 24. YouTube API v3:如何通過javascript和查詢獲得totalResults(pageInfo)?
- 25. 如何通過hibernate獲得羣組查詢結果的總數?
- 26. 如何查詢獲得通過維基API表內容
- 27. 如何獲得通過Facebook API查詢圖片(PHP)
- 28. 如何通過MySQL查詢獲得最大用戶推薦?
- 29. 如何通過mysql查詢獲得帖子的評論數?
- 30. 谷歌地圖V2 epoly2邁克如何獲得美國xml的
根據您上面提供的日曆語法文檔中的規則和限制,當你SYS解決方案是理想的。因此,它是DBA最適合的解決方案,但不適用於db用戶。無論如何,我會upvote你的答案,因爲它以某種方式解決問題。 – yopez83
它爲什麼需要SYS權限?它表示「只有SYS可以在SYS模式中執行任何操作」,但是您可以在自己的模式中創建計劃,您只需要'CREATE JOB'特權,請參閱[使用說明](http://docs.oracle.com/cd /B19306_01/appdev.102/b14258/d_sched.htm#sthref5542)。 –
這確實取決於你組織的政策。對於我創建一個作業,我需要一個DBA爲我創建它。這不像跑步和瞧! – yopez83