Hoy vamos a ver una pequeña función PL/SQL que me hice en su día que sirve para sumarle a una fecha dada, N días hábiles. Es una función sencillita que, por ahora, sólo tiene en cuenta Sábados y Domingos, pero que puede ser muy práctica para cuando se quiere trabajar con fechas y realizar este tipo de cálculos.
Código días hábiles PL/SQL
create or replace function Sumar_Dias_Habiles (fecha_inicio in date, dias_habiles in number) Return date As dia number; dia_habil number; hoy date; fecha_fin date; begin dia := 0; dia_habil := dias_habiles; -- variable numdias while dia = dia_habil loop hoy := fecha_inicio+dia; if (to_char(hoy,'DY') = 'SAT' or to_char(hoy,'DY') = 'SUN' or to_char(hoy,'DY') = 'SÁB' or to_char(hoy,'DY') = 'DOM') then -- Es sábado o domingo dia_habil := dia_habil + 1; end if; dia := dia + 1; end loop; fecha_fin := fecha_inicio + dia_habil; return fecha_fin; end Sumar_Dias_Habiles;
Hola Javier, gracias por tu función, para solucionar lo de los otros días no hábiles, cree una tabla en la que incluyo las fechas de los días no laborales y tu función quedó así
create or replace function GETSUMDIAHABIL(v_fecha in date, v_num_dias in number) return date is
dia number;
dia_habil number;
hoy date;
fecha_fin date;
dia_no_habil number;
begin
dia := 0;
dia_habil := v_num_dias; -- variable numdias
while dia <= dia_habil loop
hoy := v_fecha+dia;
begin
select 1
into dia_no_habil
from ba_calendar c
where trunc(c.day) = trunc(hoy);
exception
when no_data_found then
dia_no_habil := 0;
end;
if dia_no_habil = 1 then -- Es sábado o domingo
dia_habil := dia_habil + 1;
end if;
dia := dia + 1;
end loop;
fecha_fin := v_fecha + dia_habil;
return(fecha_fin);
end GETSUMDIAHABIL;
Que tengas buen días
Cual es la estructura de la tabla de los otros dias no habiles
Gracias por tu respuesta
Es una tabla con una única columna de tipo Date.
calendar_id number(22)
location_id number(10)
day date
is_holiday varchar2(1)
is_laboral_day varchar2(1)
Gracias a tí Patricia. Esa solución es sencilla y fácil de implementar. Habría que mantener esa tabla todos los años, pero no es complicado. Un saludo.
Saludos y gracias por sus aportes, son estupendos.
La verdad apenas y empiezo en plsql y pos aun programo en visual basic 6, quisiera preguntar de que manera puedo ejecutar esta funcion desde visual basic 6.
Gracias.
Lo siento, en visual basic no sé cómo será porque no he programado nunca en VB pero imagino que su traducción no es complicada.
Como haria el llamado desde el query ? ??
Igual que cualquier otra función, como concat() por ejemplo.
Falla cuando la fecha es domingo, recomiendo cambiar
-- Es sábado o domingo
dia_habil := dia_habil + dia;
Se bueno.
Hola Jesús. Es una función que hice hace muchos años, cuando usaba Oracle 9i. Puede que si estás usando versiones nuevas de Oracle haya que adaptarla. Ahora mismo no te la puedo adaptar porque no tengo ningún Oracle donde poder hacerlo. Un saludo.
Esta es una posible solución, se vería así el while y declarar la variable adicional usada cae_sab o cae_dom:
Días Siguientes:
while dia <= dia_habil loop
hoy := fecha_inicio+dia;
if (to_char(hoy,'DY') = 'SAT' or to_char(hoy,'DY') = 'SÁB') then
-- Es sábado
dia_habil := dia_habil + 1;
end if;
if (to_char(hoy,'DY') = 'SUN' or to_char(hoy,'DY') = 'DOM') then
-- Es domingo
if (dia 0)then
dom := dia - 1;
dia_habil := dia_habil + dom;
end if;
end if;
dia := dia + 1;
end loop;
fecha_fin := fecha_inicio + dia_habil;
Días Anteriores:
while dia <= dia_habil loop
hoy := fecha_inicio-dia;
if (to_char(hoy,'DY') = 'SAT' or to_char(hoy,'DY') = 'SÁB') then
-- Es sábado
if (dia 0)then
cae_sab := dia - 1;
dia_habil := dia_habil + cae_sab;
end if;
end if;
if (to_char(hoy,'DY') = 'SUN' or to_char(hoy,'DY') = 'DOM') then
-- Es domingo
dia_habil := dia_habil + 1;
end if;
dia := dia + 1;
end loop;
fecha_fin := fecha_inicio - dia_habil;
Muchas gracias Jesús por tu aporte!