我最近被要求提出一个返回美国假期的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. 通过CloudMade获取美国州的几何坐标
- 5. 公共假期检查员(英国)
- 6. 如何通过JSON数组获得价值如查询
- 7. 两个日期不同,美国节假日除外
- 8. 想通过java转换美国格式的日期
- 9. D3.js加载美国通过SVG
- 10. 如何美国日期格式转换为MYSQL格式INSERT查询
- 11. 如何获得通过多meta_value与SQL查询POST_ID
- 12. 如何通过MySQL查询使用BirthDate列获得年龄?
- 13. 如何通过使用CMIS查询获得1000多个文档
- 14. 如何获得通过Facebook API查询图片(PHP)
- 15. 如何通过hibernate获得群组查询结果的总数?
- 16. 谷歌地图V2 epoly2迈克如何获得美国xml的
- 17. Django:如何获取美国日期格式的表单?
- 18. 如何从Flickr照片搜索查询中获得国籍?
- 19. 如何获得audience_size兴趣加上国家查询
- 20. Matlab中的德国假期
- 21. 国家假期列表
- 22. 我如何查询国家特定美食的谷歌地点?
- 23. 如何通过坐标获得世界国家的边界?
- 24. 如何通过geoname webservice获得英国地区
- 25. 如何通过用户名查找最后10个oracle查询?
- 26. 如何正确查询oracle日期?
- 27. 当查询Google Maps API时,我得到了“纽约,美国”和“纽约,纽约,美国”的相同结果
- 28. 如何获得LINQ查询
- 29. 通过向Oracle查询添加组,并得到一个错误
- 30. 任何人都知道我如何通过webservice版本获得美国加油站价格的实时饲料?
根据您上面提供的日历语法文档中的规则和限制,当你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