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 утра. Но мне не нравится идея другой работы.

Спасибо!

2 ответа

Решение

Вы можете использовать оператор 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

Другие вопросы по тегам