Oracle dbms_job:作业只能在工作日的上午6点至晚上8点运行

|| 我有一个具有不同工作的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点之间运行(在hh24 06:00至20:00)。 我的第一个想法(也是最后的选择)是加班,将主工作设置为“晚上8点至早上6点之间”“中断”。但是我不喜欢换一份工作的想法。 谢谢!     
已邀请:
您可以在间隔中使用一个case语句检查一天中的时间,然后跳过:
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 
尽管...认为我们现在正处在“使功能恢复正常”阶段。 :)     
将间隔设为一个函数,然后您就可以拥有所需的任何控件。 请参见此处的示例: http://www.orafaq.com/node/871     

要回复问题请先登录注册