Hoy les quiero compartir una función que me ha servido mucho para generar alertas, cálculo de procesos en días hábiles, ejecución de tareas en días hábiles, entre otros, realmente es cuestión de ser creativo y encontrarle varias finalidades.

Mi principal fin era contar 5 días hábiles apartir del día en que se ingresará un tiquete de servicio, esto ya que la atención del mismo debía esperar ese tiempo.

En la siguiente función hago un ciclo el cuál recorre 10 días a partir del día de ingreso ya que así lo definí, en caso de requerir n cantidad de días más, ese valor se puede aumentar.

Por último el 5 que esta en el if que evalúa la condifición de la variable cantidad de días, es el que establece la cantidad de días hábiles que deseamos calcular.

Al final, la función nos devolverá una fecha de tipo timestamp con el día exacto en que se cumplan los 5 días hábiles, sin más les dejó la función:

create or replace function "DIAS_HABILES"
 return TIMESTAMP
 is
 cantidad_dias number(10,0);
 fecha_futura date;
 fecha_final TIMESTAMP;
 begin
 FOR i IN 1..10 --ciclo de recorrido de días hábiles
 LOOP
 SELECT Count(*) BusDaysBtwn 
      into cantidad_dias FROM 
     (
     SELECT TO_DATE(sysdate, 'DD-MM-YYYY') + LEVEL-1 InstallDate 
      , TO_DATE(sysdate, 'DD-MM-YYYY') CompleteDate    
      , TO_CHAR(TO_DATE(TO_CHAR ((SYSDATE), 'DD-MM-YYYY'), 'DD-MM-YYYY') + LEVEL-1, 'DY') InstallDay  
     FROM dual 
     CONNECT BY LEVEL <= (TO_DATE(TO_CHAR ((SYSDATE+i), 'DD-MM-YYYY'), 'DD-MM-YYYY') - (TO_DATE(TO_CHAR ((SYSDATE), 'DD-MM-YYYY'), 'DD-MM-YYYY')))  
     ) 
     WHERE InstallDay NOT IN ('FRI', 'SAT');
 fecha_futura := TO_DATE(TO_CHAR ((SYSDATE+i), 'DD-MM-YYYY'), 'DD-MM-YYYY');
 IF cantidad_dias = 5 THEN --el 5 es porque se desea calcular 5 días hábiles siempre
       exit;
    END IF;
 END LOOP;
 SELECT TO_CHAR (fecha_futura, 'DD-MON-YYYY HH:MI:SSPM') into fecha_final FROM DUAL;
 return fecha_final;
 end;

Puede modificarse de tal manera que la cantidad de días y el intervalo de tiempo se reciban por parámetros.

Adicionalmente debo indicar que esta función sirve bajo los siguientes parámetros de la aplicación de Apex:

Esto es necesario ya que sino cuando se ejecuté el proceso podrían presentarse problemas de compilación.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *