Saya akan selalu merekomendasikan Tabel Kalender , maka Anda cukup menggunakan:
SELECT COUNT(*)
FROM dbo.CalendarTable
WHERE IsWorkingDay = 1
AND [Date] > @StartDate
AND [Date] <= @EndDate;
Karena SQL tidak memiliki pengetahuan tentang hari libur nasional, misalnya jumlah hari kerja antara dua tanggal tidak selalu mewakili jumlah hari kerja. Inilah sebabnya mengapa tabel kalender adalah suatu keharusan bagi sebagian besar database. Mereka tidak memakan banyak memori dan menyederhanakan banyak kueri.
Tetapi jika ini bukan pilihan maka Anda dapat membuat tabel tanggal dengan relatif mudah dengan cepat dan menggunakan ini
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);
EDIT
Jika Anda perlu menghitung selisih antara dua kolom tanggal, Anda masih dapat menggunakan tabel kalender sebagai berikut:
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;