Jeg vil altid anbefale en kalendertabel , så kan du blot bruge:
SELECT COUNT(*)
FROM dbo.CalendarTable
WHERE IsWorkingDay = 1
AND [Date] > @StartDate
AND [Date] <= @EndDate;
Da SQL ikke har kendskab til nationale helligdage, repræsenterer for eksempel antallet af hverdage mellem to datoer ikke altid antallet af arbejdsdage. Derfor er en kalendertabel et must for de fleste databaser. De tager ikke meget hukommelse og forenkler mange forespørgsler.
Men hvis dette ikke er en mulighed, så kan du relativt nemt generere en tabel med datoer på farten og bruge denne
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);
REDIGER
Hvis du har brug for at beregne forskellen mellem to datokolonner, kan du stadig bruge din kalendertabel som sådan:
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;