Created
March 13, 2013 05:13
-
-
Save fcojperez/5149550 to your computer and use it in GitHub Desktop.
Función para el Cálculo de Días Laborables en Transact-SQL
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
You save my life!!