カレンダー テーブル> の場合、次のように簡単に使用できます:
SELECT COUNT(*) FROM dbo.CalendarTable WHERE IsWorkingDay = 1 AND [Date] > @StartDate AND [Date] <= @EndDate;
プレ>たとえば、SQL は国民の祝日を認識しないため、2 つの日付の間の平日の日数は、必ずしも稼働日数を表すとは限りません。これが、ほとんどのデータベースでカレンダー テーブルが必須である理由です。それらは多くのメモリを必要とせず、多くのクエリを簡素化します。
しかし、これがオプションでない場合は、その場で比較的簡単に日付のテーブルを生成して、これを使用できます
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);
プレ>編集
2 つの日付列の差を計算する必要がある場合でも、カレンダー テーブルをそのまま使用できます。
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;
プレ>