domingo, 22 de febrero de 2009

Dias hábiles entre dos fechas [SQL]

He aquí una función útil para calcular la diferencia de días hábiles entre dos fechas. (MSSQL) Primero, una función para dar de alta fechas feriadas. Puede variar mucho de acuerdo al país. La encontré aqui: http://www.eggheadcafe.com/articles/20030626.asp. Pero le hice la modificación para que, en caso de que la fecha final sea menor que la inicial regrese un valor negativo.
/*
función para determinar si un día es festivo
trabaja en conjunto con dbo.GetBusinessDays
para calcular la diferencia en días hábiles
entre dos fechas
*/
CREATE function dbo.IsDateAHoliday
(
@CurDate datetime
)
returns int
as
begin

declare @ret int

select @ret = 0

select @ret = case
/*
el datepart(mm,@CurDate) es la parte del mes
datepart(dd,@CurDate) es la parte del día
-para dar de alta un día festivo se pone un when con el mes y el día
que se necesite
*/
when datepart(mm,@CurDate) = 1 and datepart(dd,@CurDate) = 1 then 1 --año nuevo
when datepart(mm,@CurDate) = 16 and datepart(dd,@CurDate) = 1 then 1 --indep.
when datepart(mm,@CurDate) = 12 and datepart(dd,@CurDate) = 25 then 1 --navidad
else 0
end

return @ret

Y ahora la función para calcular la diferencia
create function dbo.GetBusinessDays
(
@StartDate datetime,
@EndDate datetime
)
returns int
as
begin

declare @factor int
set @factor = 1

if @StartDate > @EndDate
begin
declare @tempo datetime
set @tempo = @StartDate
set @StartDate=@EndDate
set @EndDate=@tempo
set @factor=-1
end

declare @DaysBetween int
declare @BusinessDays int
declare @Cnt int
declare @EvalDate datetime

select @DaysBetween = 0
select @BusinessDays = 0
select @Cnt=0

select @DaysBetween = datediff(Day,@StartDate,@endDate) + 1

while @Cnt < @DaysBetween
begin

select @EvalDate = @StartDate + @Cnt

if (dbo.IsDateAHoliday(@EvalDate) = 0)
BEGIN
if ((datepart(dw,@EvalDate) <> 1) and (datepart(dw,@EvalDate) <> 7))
BEGIN
select @BusinessDays = @BusinessDays + 1
END
END

select @Cnt = @Cnt + 1
end

return (@BusinessDays*@factor)
end

Espero que les sirva.

No hay comentarios:

Publicar un comentario