|
CREATE function fBusinessDays (@start datetime, @end datetime) returns int as begin /* Descripción: Función diseñada para calcular los días LABORABLES entre 2 fechas */
DECLARE @wks as int, @LabDays as int — Cálculo de Semanas
/*
Primero calculamos las semanas entre 2 fechas atendiendo a los siguientes casos:
- F.Inicio en FinDe y F.Fin DIA.LAB -> Convertimos F.Inicio en DIA.LAB sumando 2 días y calculando el número de semanas
- F.Inicio en DIA.LAB y F.Fin en FinDe -> Convertimos F.Fin en DIA.LAB restando 2 días y calculamos el número de semanas
- F.Inicio y Fin en Find -> Convertimos F.Inicio y F.Fin en DIA.LAB restando 2 días y calculamos el número de semanas
- Cualquier otro caso calculamos el número de semanas entre las fechas
*/
SET @wks = CASE WHEN datepart( dw, @start) in (6,7) AND datepart( dw, @end)<6 THEN datediff( week, @start+2, @end) WHEN datepart( dw, @start) < 6 AND datepart( dw, @end) in (6,7) THEN datediff( week, @start, @end-2) WHEN datepart( dw, @start) in (6,7) AND datepart( dw, @end) in (6,7) THEN datediff( week, @start-2, @end-2) ELSE datediff( week, @start, @end) END
/*
Primero calculamos el número de días DIA.LAB en función de los siguientes casos:
- F.Inicio en FinDe y F.Fin DIA.LAB -> Total de semanas calculada * 5 + la distancia entre el lunes y F.Fin
- F.Inicio en DIA.LAB y F.Fin en FinDe -> Total de semanas calculada * 5 + la distancia entre el sábado y F.Inicio
- F.Inicio y Fin en Find -> Total semanas calculadas * 5 días
- Cualquier otro caso calculamos el número de semanas entre las fechas
*/
SET @LabDays = CASE WHEN datepart( dw, @start) in (6,7) AND datepart( dw, @end) in (6,7) THEN @wks*5 WHEN datepart( dw, @start) in(6,7) AND datepart( dw, @end) < 6 THEN @wks*5 + datepart( dw, @end) WHEN datepart( dw, @start) < 6 AND datepart( dw, @end) in (6,7) THEN @wks*5 + (6 – datepart( dw, @start)) ELSE datediff( dd, @start, @end) – @wks*2 + 1 END
return( @LabDays) end |