Ik zou altijd een Kalendertabel , dan kunt u eenvoudig het volgende gebruiken:
SELECT COUNT(*)
FROM dbo.CalendarTable
WHERE IsWorkingDay = 1
AND [Date] > @StartDate
AND [Date] <= @EndDate;
Omdat SQL bijvoorbeeld geen kennis heeft van nationale feestdagen, geeft het aantal weekdagen tussen twee datums niet altijd het aantal werkdagen weer. Daarom is een kalendertabel een must voor de meeste databases. Ze nemen niet veel geheugen in beslag en vereenvoudigen veel zoekopdrachten.
Maar als dit geen optie is, kunt u relatief eenvoudig een tabel met datums genereren en deze gebruiken
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);
BEWERKEN
Als u het verschil tussen twee datumkolommen moet berekenen, kunt u uw kalendertabel nog steeds als volgt gebruiken:
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;