Skip to content

Instantly share code, notes, and snippets.

@fcojperez
Created March 13, 2013 05:13
Show Gist options
  • Save fcojperez/5149550 to your computer and use it in GitHub Desktop.
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
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
@cyanpie
Copy link

cyanpie commented May 5, 2021

You save my life!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment