Je recommanderais toujours une table de calendrier , alors vous pouvez simplement utiliser :
SELECT COUNT(*)
FROM dbo.CalendarTable
WHERE IsWorkingDay = 1
AND [Date] > @StartDate
AND [Date] <= @EndDate;
Étant donné que SQL n'a aucune connaissance des jours fériés nationaux, par exemple, le nombre de jours de semaine entre deux dates ne représente pas toujours le nombre de jours ouvrables. C'est pourquoi une table de calendrier est indispensable pour la plupart des bases de données. Ils ne prennent pas beaucoup de mémoire et simplifient beaucoup de requêtes.
Mais si ce n'est pas une option, vous pouvez générer un tableau de dates relativement facilement à la volée et l'utiliser
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);
MODIFIER
Si vous avez besoin de calculer la différence entre deux colonnes de date, vous pouvez toujours utiliser votre tableau de calendrier comme suit :
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;