Oracle/PLSQL: función que devuelve el período mensual

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: función que devuelve el período mensual

Pregunta: ¿Cómo puedo crear una función que devuelva un período correspondiente a un mes?

Un período comienza el primer lunes de cada mes y termina el domingo. Si el domingo no es el 30 o el 31, el programa debe seleccionar el primer domingo del mes siguiente.

Por ejemplo, la función debería devolver algo como esto (fecha de inicio – fecha de finalización):

6 de octubre de 2003 – 2 de noviembre de 2003

Respuesta: La siguiente función acepta como entrada un valor de fecha en el formato “yyyy/mm/dd”. La función toma esta fecha y devuelve el período de tiempo en el que cae la fecha.

create or replace function get_period (pDate varchar2)
   return varchar2
is
   v_period_start date;
   v_period_end date;
   v_check_date date;

begin

   /* Determine the 1st of the month */
   v_check_date := TRUNC(TO_DATE(pDate, 'yyyy/mm/dd'),'MM');

   /* Find first monday */
   loop
      exit when TO_NUMBER(TO_CHAR(v_check_date,'d')) = 2;
      v_check_date := v_check_date + 1;
   end loop;

   v_period_start := v_check_date;

   /* Determine last sunday of current month */
   v_period_end := v_period_start + 27;

   /* Take the sunday in next month if the sunday falls */
   /* on the 29th or earlier */
   if TO_NUMBER(TO_CHAR(v_period_end, 'dd')) < 30 then
      v_period_end := v_period_end + 7;
   end if;

   return v_period_start || ' - ' || v_period_end;

end get_period ;