Siempre recomendaría una Calendar table , entonces simplemente puede usar:
SELECT COUNT(*)
FROM dbo.CalendarTable
WHERE IsWorkingDay = 1
AND [Date] > @StartDate
AND [Date] <= @EndDate;
Dado que SQL no tiene conocimiento de los días festivos nacionales, por ejemplo, la cantidad de días de la semana entre dos fechas no siempre representa la cantidad de días hábiles. Esta es la razón por la cual una tabla de calendario es imprescindible para la mayoría de las bases de datos. No ocupan mucha memoria y simplifican muchas consultas.
Pero si esta no es una opción, puede generar una tabla de fechas con relativa facilidad sobre la marcha y usar esto
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);
EDITAR
Si necesita calcular la diferencia entre dos columnas de fecha, aún puede usar su tabla de calendario de la siguiente manera:
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;