Jag skulle alltid rekommendera en kalendertabell , då kan du helt enkelt använda:
SELECT COUNT(*)
FROM dbo.CalendarTable
WHERE IsWorkingDay = 1
AND [Date] > @StartDate
AND [Date] <= @EndDate;
Eftersom SQL inte har någon kunskap om nationella helgdagar representerar till exempel antalet veckodagar mellan två datum inte alltid antalet arbetsdagar. Det är därför en kalendertabell är ett måste för de flesta databaser. De tar inte mycket minne och förenklar många frågor.
Men om detta inte är ett alternativ kan du generera en tabell över datum relativt enkelt i farten och använda denna
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);
REDIGERA
Om du behöver beräkna skillnaden mellan två datumkolumner kan du fortfarande använda din kalendertabell som så:
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;