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;