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.