Zawsze polecam tabela kalendarza , możesz po prostu użyć:
SELECT COUNT(*)
FROM dbo.CalendarTable
WHERE IsWorkingDay = 1
AND [Date] > @StartDate
AND [Date] <= @EndDate;
Ponieważ SQL nie zna na przykład świąt państwowych, liczba dni roboczych między dwiema datami nie zawsze odzwierciedla liczbę dni roboczych. Dlatego tabela kalendarza jest koniecznością dla większości baz danych. Nie zajmują dużo pamięci i upraszczają wiele zapytań.
Ale jeśli nie jest to możliwe, możesz stosunkowo łatwo wygenerować tabelę dat w locie i użyć tego
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);
EDYTUJ
Jeśli chcesz obliczyć różnicę między dwiema kolumnami dat, nadal możesz użyć tabeli kalendarza w następujący sposób:
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;