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.