Oracle/PLSQL: agregar fecha a fecha (omitir sábado y domingo)

Los datos expuestos en este blog, son solo de índole informativo. Por favor realiza siempre una copia de seguridad antes de realizar cualquier cambio en tu proyecto.

Oracle/PLSQL: agregar fecha a fecha (omitir sábado y domingo)

Problema: He logrado agregar días a una fecha dada en mi programa. Mi pregunta es ¿cómo puedo manipular el programa para saltarme los fines de semana y días festivos?

Por ejemplo:

Si la fecha es 19 de septiembre de 2003 y le sumo 2 días, la fecha resultante debe ser 23/9/2003.

Respuesta: Para omitir los fines de semana al agregar días a una fecha, debe crear una función personalizada. A continuación se muestra la función que escribimos llamada custom_add_days. Acepta dos parámetros: start_date_in y days_in.

Esta función toma el valor start_date_in y agrega el número de días a la variable days_in, omitiendo el sábado y el domingo.

Esta característica no omite los días festivos porque Oracle no puede identificar qué días son festivos. Sin embargo, podría intentar llenar una tabla de vacaciones y luego consultar esa tabla para determinar los días adicionales que se saltearán.

CREATE OR REPLACE Function custom_add_days
   (start_date_in date, days_in number)
   return date
IS
   v_counter number;
   v_new_date date;
   v_day_number number;

BEGIN

   /* This routine will add a specified number of days (ie: days_in) to a date (ie: start_date). */
   /* It will skip all weekend days - Saturdays and Sundays */
   v_counter := 1;
   v_new_date := start_date_in;

   /* Loop to determine how many days to add */
   while v_counter <= days_in
   loop

      /* Add a day */
      v_new_date := v_new_date + 1;
      v_day_number := TO_CHAR(v_new_date, 'd');

      /* Increment counter if day falls between Monday to Friday */
      if v_day_number >= 2 and v_day_number <= 6 then
         v_counter := v_counter + 1;
      end if;

   end loop;

   RETURN v_new_date;

EXCEPTION
WHEN OTHERS THEN
   raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
END;