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
Хотя... думаю, что мы сейчас твердо на этапе "время, чтобы исправить функцию".:)
Сделайте интервал функцией, тогда вы можете иметь любой контроль, который вам нравится.
Смотрите здесь для примера: