甲骨文第一天无节假日排程

Oracle schedule on first day of month without holidays

我需要在 Oracle 中为 运行 个作业创建计划。它会在每个月的第一个工作日 运行,但不包括节假日。当月的第一个工作日是假期时,运行 应该是假期后的下一个工作日。

我用每个月的第一个工作日管理并排除假期,但我不知道如何在假期后的工作日设置运行...

假期

DBMS_SCHEDULER.CREATE_SCHEDULE (
  schedule_name   => 'SCHDL_COM_HOLIDAYS',
  repeat_interval => 'FREQ=YEARLY; BYDATE=0101,0111;'
);

第一个工作日

DBMS_SCHEDULER.CREATE_SCHEDULE (
  schedule_name   => 'SCHDL_FIRST_WD',
  repeat_interval => 'FREQ=MONTHLY; BYDAY=MON,TUE,WED,THU,FRI; EXCLUDE=SCHDL_COM_HOLIDAYS; BYSETPOS=1'
);

请按照以下步骤操作:

1) 为所有假期创建时间表。

BEGIN
   DBMS_SCHEDULER.create_schedule (
      schedule_name     => 'NYD_FRI',
      repeat_interval   => 'FREQ=YEARLY;BYDATE=1231;BYDAY=FRI',
      comments          => 'Friday alternative for New Year''s Day');
   DBMS_SCHEDULER.create_schedule (
      schedule_name     => 'NYD_MON',
      repeat_interval   => 'FREQ=YEARLY;BYDATE=0102;BYDAY=MON',
      comments          => 'Monday alternative for New Year''s Day');
   DBMS_SCHEDULER.create_schedule (
      schedule_name     => 'NewYearsDay',
      repeat_interval   =>    'FREQ=YEARLY;BYDATE=0101;BYDAY=MON,TUE,WED,THU,FRI;'
                           || 'INCLUDE=NYD_FRI,NYD_MON',
      comments          => 'New Year''s Day');
  );
END;
/

2) 创建一个时间表,其中包含上面创建的所有时间表。

BEGIN
   DBMS_SCHEDULER.create_schedule (
      schedule_name     => 'FederalHolidays',
      repeat_interval   =>  'NewYearsDay,MartinLutherKing,PresidentsDay,',
      comments          => 'Federal Holidays');
END;

3) 创建作业,注意“EXCLUDE”和“BYSETPOS”选项

BEGIN
   DBMS_SCHEDULER.create_job (
      job_name          => 'Run_Next_Day',
      job_type          => 'PLSQL_BLOCK',
      job_action        => 'begin Run_Next_Day; end; ',
      repeat_interval   => 'FREQ=MONTHLY; BYDAY=MON,TUE,WED,THU,FRI; byhour=14;byminute=30;bysecond=0; EXCLUDE=FederalHolidays; BYSETPOS=7',
      enabled           => TRUE,
      comments          => 'Skipping Holidays');
END;
/

@XING 谢谢你的帮助。我完全根据我的需要修改了您的解决方案。

完全符合我的问题的答案是

元旦

BEGIN
DBMS_SCHEDULER.create_schedule (
  schedule_name     => 'SCHD_NYD_MON',
  repeat_interval   => 'FREQ=YEARLY;BYDATE=0101;BYDAY=MON',
  comments          => 'Monday alternative for New Year''s Day');
DBMS_SCHEDULER.create_schedule (
  schedule_name     => 'SCHD_NEW_YEAR_DAY',
  repeat_interval   =>    'FREQ=YEARLY;BYDATE=0101;BYDAY=MON,TUE,WED,THU,FRI;'
                       || 'INCLUDE=SCHD_NYD_MON',
  comments          => 'New Year''s Day');
END;
/

十一月一日

BEGIN
DBMS_SCHEDULER.create_schedule (
  schedule_name     => 'SCHD_FNOV_MON',
  repeat_interval   => 'FREQ=YEARLY;BYDATE=1101;BYDAY=MON',
  comments          => 'Monday alternative for First November');
DBMS_SCHEDULER.create_schedule (
  schedule_name     => 'SCHD_FIRST_NOVEMBER',
  repeat_interval   =>    'FREQ=YEARLY;BYDATE=1101;BYDAY=MON,TUE,WED,THU,FRI;'
                       || 'INCLUDE=SCHD_FNOV_MON',
  comments          => 'First November''s Day');
END;
/

联邦假期

BEGIN
   DBMS_SCHEDULER.create_schedule (
      schedule_name     => 'SCHD_HOLIDAYS',
      repeat_interval   => 'SCHD_NEW_YEAR_DAY,SCHD_FIRST_NOVEMBER',
      comments          => 'Federal Holidays');
END;
/

工作

BEGIN
  DBMS_SCHEDULER.create_job (
     job_name          => 'Run_Next_Day',
     job_type          => 'PLSQL_BLOCK',
     job_action        => 'begin Run_Next_Day; end; ',
     repeat_interval   => 'FREQ=MONTHLY; BYDAY=MON,TUE,WED,THU,FRI; 
                           byhour=12;byminute=0;bysecond=0; 
                           EXCLUDE=SCHD_HOLIDAYS; BYSETPOS=1',
     enabled           => TRUE,
     comments          => 'Skipping Holidays');
END;
/