Oracle dbms_job: el trabajo tiene que ejecutar solo entre semana de 6 a.m. a 8 p.m.
Pregunta
Tengo una base de datos Oracle 10G con diferentes trabajos. Uno de los trabajos de las this tiene que funcionar cada dos horas. Por lo tanto, los parámetros "next_dat" y "intervalo" se ven así.
,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'')'
Los trabajos no necesitan correr por la noche. Entonces, la pregunta es: ¿es posible diseñar, por ejemplo, "intervalo" de esa manera, que los trabajos solo se ejecutan entre las 6 a.m. y las 8 p.m. (en HH24 06:00 hasta las 20:00).
Mi primera idea (y la última opción) es un trabajo adicional que establece el trabajo principal en "roto" entre las 8 p.m. y las 6 a.m. Pero no me gusta la idea de un trabajo diferente.
¡Gracias!
Solución
Puede usar una declaración de caso en el intervalo para verificar la hora del día y luego omitir:
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
Esto se puede ampliar para incluir un cheque en el día de la semana. (Debe tener cuidado al verificar el día de la semana, ya que depende de la configuración de NLS).
Algo como lo siguiente manejaría el día de la semana, pero tendrá que confirmar los casos de borde y verificar su configuración de NLS (para mí, el lunes es el día 1 y el domingo es el día 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
Aunque ... piense que ahora estamos firmemente en la etapa de "tiempo para corregir una función". :)
Otros consejos
Haga del intervalo una función, luego puede tener el control que desee.
Vea aquí para un ejemplo: