Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Berechnung von Tagen ohne Wochenenden (Montag bis Freitag) in SQL Server

Ich würde immer eine Kalendertabelle , dann können Sie einfach verwenden:

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

Da SQL beispielsweise keine Kenntnis von Feiertagen hat, entspricht die Anzahl der Wochentage zwischen zwei Daten nicht immer der Anzahl der Arbeitstage. Aus diesem Grund ist eine Kalendertabelle für die meisten Datenbanken ein Muss. Sie nehmen nicht viel Speicherplatz in Anspruch und vereinfachen viele Abfragen.

Aber wenn dies nicht möglich ist, können Sie relativ einfach spontan eine Tabelle mit Daten erstellen und diese verwenden

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

BEARBEITEN

Wenn Sie die Differenz zwischen zwei Datumsspalten berechnen müssen, können Sie Ihre Kalendertabelle trotzdem wie folgt verwenden:

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;

Beispiel für SQL-Fiddle