Oracle dbms_job: работа должна выполняться только в будний день с 6 утра до 8 вечера - PullRequest
2 голосов
/ 27 апреля 2011

У меня есть база данных 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:00 до 20:00 (в период с 06:00 до 20:00).

Моей первой идеей (и последним выбором) является дополнительная работа, которая устанавливает основной режим как «сломанный» между 8 вечера и 6 утра. Но мне не нравится идея другой работы.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 27 апреля 2011

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

Хотя ... думаю, что мы сейчас твердо на этапе "время, чтобы исправить функцию".:)

2 голосов
/ 27 апреля 2011

Сделайте интервал функцией, тогда вы можете иметь любой элемент управления, который вам нравится.

Смотрите пример:

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

...