Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Calcul des jours à l'exclusion des week-ends (du lundi au vendredi) dans SQL Server

Je recommanderais toujours une table de calendrier , alors vous pouvez simplement utiliser :

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

Étant donné que SQL n'a aucune connaissance des jours fériés nationaux, par exemple, le nombre de jours de semaine entre deux dates ne représente pas toujours le nombre de jours ouvrables. C'est pourquoi une table de calendrier est indispensable pour la plupart des bases de données. Ils ne prennent pas beaucoup de mémoire et simplifient beaucoup de requêtes.

Mais si ce n'est pas une option, vous pouvez générer un tableau de dates relativement facilement à la volée et l'utiliser

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);

MODIFIER

Si vous avez besoin de calculer la différence entre deux colonnes de date, vous pouvez toujours utiliser votre tableau de calendrier comme suit :

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;

Exemple sur SQL-Fiddle