Oracle dbms_job:job必须只在工作日上午6点到晚上8点运行

时间:2011-04-27 07:39:17

标签: oracle oracle10g jobs intervals dbms-job

我有一个带有不同工作的oracle 10g数据库。其中一项工作必须每两个小时运行一次。因此,“next_dat”和“interval”参数看起来就像那样。

   ,next_date => to_date('27.04.2011 10:18:00','dd/mm/yyyy hh24:mi:ss')
   ,interval  => 'to_date(to_char(sysdate + (2/24), ''DD.MM.YYYY HH24:MI''), ''DD.MM.YYYY HH24:MI'')'

工作不需要在晚上运行。所以问题是:是否有可能以这种方式设计“间隔”,即工作仅在早上6点到晚上8点之间运行(在06:00至06:00之间)。

我的第一个想法(和最后一个选择)是一项额外的工作,它将主要工作设置为在晚上8点到早上6点之间“破损”。但我不喜欢不同工作的想法。

谢谢!

2 个答案:

答案 0 :(得分:3)

您可以在间隔中使用案例陈述来检查一天中的时间,然后跳过:

case
  when to_char(trunc(sysdate, 'HH24') + 2/24, 'HH24') between '06' and '20' then
    trunc(sysdate, 'HH24') + 2/24 
  else
    trunc(sysdate)+1+(6/24)
end

这可以扩展为包括工作日的支票。 (您需要注意检查星期几,因为它取决于NLS设置。)

以下内容将处理工作日,但您必须确认边缘情况并检查您的NLS设置(对我而言,星期一是第1天,星期日是第7天):

case
  when
    to_number(to_char(sysdate, 'D')) between 1 and 5 then
      case
        when to_char(trunc(sysdate, 'HH24') + 2/24, 'HH24') between '06' and '20'
                                                                            then 
          trunc(sysdate, 'HH24') + 2/24 
        else 
          trunc(sysdate)+1+(6/24)
        end
  else
    trunc(sysdate) + (8 - to_number(to_char(sysdate, 'D'))) + 6/24
end 

虽然......认为我们现在已经坚定地处于“正确的功能”阶段。 :)

答案 1 :(得分:2)

使间隔成为一个功能,然后你就可以拥有自己喜欢的任何控制。

见这里的例子:

http://www.orafaq.com/node/871