Винаги бих препоръчал Календарна таблица , тогава можете просто да използвате:
SELECT COUNT(*)
FROM dbo.CalendarTable
WHERE IsWorkingDay = 1
AND [Date] > @StartDate
AND [Date] <= @EndDate;
Тъй като SQL не познава националните празници, например, броят на дните от седмицата между две дати не винаги представлява броя на работните дни. Ето защо календарната таблица е задължителна за повечето бази данни. Те не заемат много памет и опростяват много заявки.
Но ако това не е опция, тогава можете да генерирате таблица с дати относително лесно в движение и да използвате това
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);
РЕДАКТИРАНЕ
Ако трябва да изчислите разликата между две колони с дати, пак можете да използвате таблицата на календара си по следния начин:
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;