我很困惑,您正在混合周一和周日(2015-07-12 是周一,而不是周日)并且您更改了问题中的要求。
据我了解您的日程安排,为了简化,您喜欢CREAZIONE_OCCORRENZE
每周一工作,除了“7 月的第二个星期一到最后一个星期一,但 8 月的一个星期一”。作业ASSEGNAZIONE_AULE
总是在五天后运行。
然后你可以使用排除项。应该是这个:
BEGIN
DBMS_SCHEDULER.CREATE_SCHEDULE (
schedule_name => 'MONDAY_AUGUST',
repeat_interval => 'FREQ=MONTHLY;INTERVAL=1;BYMONTH=AUG;BYDAY=-5 MON,-4 MON,-3 MON,-2 MON');
DBMS_SCHEDULER.CREATE_SCHEDULE (
schedule_name => 'MONDAY_JULY',
repeat_interval => 'FREQ=MONTHLY;INTERVAL=1;BYMONTH=JUL;BYDAY=2 MON,3 MON,4 MON,5 MON');
DBMS_SCHEDULER.CREATE_SCHEDULE (
schedule_name => 'MONDAYS',
repeat_interval => 'FREQ=WEEKLY;INTERVAL=1;BYDAY=MON;EXCLUDE=MONDAY_AUGUST,MONDAY_JULY');
DBMS_SCHEDULER.CREATE_SCHEDULE (
schedule_name => 'SUNDAYS',
repeat_interval => 'MONDAYS+OFFSET:6D');
END;
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'CREAZIONE_OCCORRENZE',
job_type => 'STORED_PROCEDURE',
job_action => 'pop_occr_lezione'
start_date => NULL,
end_date => NULL,
repeat_interval => 'MONDAYS'
enabled => true,
auto_drop => false);
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'ASSEGNAZIONE - AULE',
job_type => 'STORED_PROCEDURE',
job_action => 'ass_aule'
start_date => NULL,
end_date => NULL,
repeat_interval => 'SUNDAYS'
enabled => true,
auto_drop => false);
END;
/
以及用于测试计划的 PL/SQL 块:
DECLARE
next_run_date TIMESTAMP WITH TIME ZONE;
BEGIN
next_run_date := NULL;
DBMS_OUTPUT.PUT_LINE ('Excluded Mondays in August' );
FOR i IN 1..10 LOOP
DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING('MONDAY_AUGUST', NULL, next_run_date, next_run_date);
DBMS_OUTPUT.PUT_LINE ( TO_CHAR(next_run_date, 'yyyy-mm-dd wTH fmDay') );
END LOOP;
next_run_date := NULL;
DBMS_OUTPUT.PUT_LINE ('Excluded Mondays in July' );
FOR i IN 1..10 LOOP
DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING('MONDAY_JULY', NULL, next_run_date, next_run_date);
DBMS_OUTPUT.PUT_LINE ( TO_CHAR(next_run_date, 'yyyy-mm-dd wTH fmDay') );
END LOOP;
next_run_date := NULL;
DBMS_OUTPUT.PUT_LINE ('Executions Job 1' );
FOR i IN 1..150 LOOP
DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING('MONDAYS', NULL, next_run_date, next_run_date);
IF TO_CHAR(next_run_date, 'IW') BETWEEN 25 AND 38 THEN -- avoid excessive output
DBMS_OUTPUT.PUT_LINE ( TO_CHAR(next_run_date, 'yyyy-mm-dd wTH fmDay') );
END IF;
END LOOP;
next_run_date := NULL;
DBMS_OUTPUT.PUT_LINE ('Executions Job 2' );
FOR i IN 1..150 LOOP
DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING('SUNDAYS', NULL, next_run_date, next_run_date);
IF TO_CHAR(next_run_date, 'IW') BETWEEN 25 AND 38 THEN -- avoid excessive output
DBMS_OUTPUT.PUT_LINE ( TO_CHAR(next_run_date, 'yyyy-mm-dd wTH fmDay') );
END IF;
END LOOP;
END;
Excluded Mondays in August
2015-08-03 1st Monday
2015-08-10 2nd Monday
2015-08-17 3rd Monday
2015-08-24 4th Monday
2016-08-01 1st Monday
2016-08-08 2nd Monday
2016-08-15 3rd Monday
2016-08-22 4th Monday
2017-08-07 1st Monday
2017-08-14 2nd Monday
Excluded Mondays in July
2015-07-13 2nd Monday
2015-07-20 3rd Monday
2015-07-27 4th Monday
2016-07-11 2nd Monday
2016-07-18 3rd Monday
2016-07-25 4th Monday
2017-07-10 2nd Monday
2017-07-17 3rd Monday
2017-07-24 4th Monday
2017-07-31 5th Monday
Executions Job 1
2015-06-15 3rd Monday
2015-06-22 4th Monday
2015-06-29 5th Monday
2015-07-06 1st Monday
2015-08-31 5th Monday
2015-09-07 1st Monday
2015-09-14 2nd Monday
2016-06-20 3rd Monday
2016-06-27 4th Monday
2016-07-04 1st Monday
2016-08-29 5th Monday
2016-09-05 1st Monday
2016-09-12 2nd Monday
2016-09-19 3rd Monday
2017-06-19 3rd Monday
2017-06-26 4th Monday
2017-07-03 1st Monday
2017-08-28 4th Monday
2017-09-04 1st Monday
2017-09-11 2nd Monday
2017-09-18 3rd Monday
2018-06-18 3rd Monday
2018-06-25 4th Monday
2018-07-02 1st Monday
Executions Job 2
2015-06-21 3rd Sunday
2015-06-28 4th Sunday
2015-07-05 1st Sunday
2015-07-12 2nd Sunday
2015-09-06 1st Sunday
2015-09-13 2nd Sunday
2015-09-20 3rd Sunday
2016-06-26 4th Sunday
2016-07-03 1st Sunday
2016-07-10 2nd Sunday
2016-09-04 1st Sunday
2016-09-11 2nd Sunday
2016-09-18 3rd Sunday
2016-09-25 4th Sunday
2017-06-25 4th Sunday
2017-07-02 1st Sunday
2017-07-09 2nd Sunday
2017-09-03 1st Sunday
2017-09-10 2nd Sunday
2017-09-17 3rd Sunday
2017-09-24 4th Sunday
2018-06-24 4th Sunday
2018-07-01 1st Sunday
2018-07-08 2nd Sunday