Skip to content

Instantly share code, notes, and snippets.

@fcojperez
Created March 13, 2013 05:13
Show Gist options
  • Select an option

  • Save fcojperez/5149550 to your computer and use it in GitHub Desktop.

Select an option

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
Copy Markdown

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