sql >> Base de Datos >  >> RDS >> Sqlserver

Cálculo de días para excluir fines de semana (de lunes a viernes) en SQL Server

Siempre recomendaría una Calendar table , entonces simplemente puede usar:

SELECT  COUNT(*)
FROM    dbo.CalendarTable
WHERE   IsWorkingDay = 1
AND     [Date] > @StartDate
AND     [Date] <= @EndDate;

Dado que SQL no tiene conocimiento de los días festivos nacionales, por ejemplo, la cantidad de días de la semana entre dos fechas no siempre representa la cantidad de días hábiles. Esta es la razón por la cual una tabla de calendario es imprescindible para la mayoría de las bases de datos. No ocupan mucha memoria y simplifican muchas consultas.

Pero si esta no es una opción, puede generar una tabla de fechas con relativa facilidad sobre la marcha y usar esto

SET DATEFIRST 1;
DECLARE @StartDate DATETIME = '20131103', 
        @EndDate DATETIME = '20131104';

-- GENERATE A LIST OF ALL DATES BETWEEN THE START DATE AND THE END DATE
WITH AllDates AS
(   SELECT  TOP (DATEDIFF(DAY, @StartDate, @EndDate))
            D = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.Object_ID), @StartDate)
    FROM    sys.all_objects a
            CROSS JOIN sys.all_objects b
)
SELECT  WeekDays = COUNT(*)
FROM    AllDates
WHERE   DATEPART(WEEKDAY, D) NOT IN (6, 7);

EDITAR

Si necesita calcular la diferencia entre dos columnas de fecha, aún puede usar su tabla de calendario de la siguiente manera:

SELECT  t.ID,
        t.Date1,
        t.Date2,
        WorkingDays = COUNT(c.DateKey)
FROM    TestTable t
        LEFT JOIN dbo.Calendar c
            ON c.DateKey >= t.Date1
            AND c.DateKey < t.Date2
            AND c.IsWorkingDay = 1
GROUP BY t.ID, t.Date1, t.Date2;

Ejemplo en SQL-Fiddle