Ну тогда, используя Sql Server 2005, вы можете попробовать что-то вроде
DECLARE @Table TABLE(
ID INT,
StartDate DATETIME,
EndDate DATETIME
)
INSERT INTO @Table (ID,StartDate,EndDate) SELECT 1, '25 Jan 2009', '31 Jan 2009'
INSERT INTO @Table (ID,StartDate,EndDate) SELECT 2, '01 Jan 2009', '07 Jan 2009'
INSERT INTO @Table (ID,StartDate,EndDate) SELECT 3, '01 Jan 2009', '14 Jan 2009'
DECLARE @MinDate DATETIME,
@MaxDate DATETIME
SELECT @MinDate = MIN(StartDate) ,
@MaxDate = MAX(EndDate)
FROM @Table
--Create a temp result set between the Min and Max dates, with all dates, and their weekday names
;WITH DayValues AS(
SELECT @MinDate DateVal,
DATENAME(dw, @MinDate) DateValName
UNION ALL
SELECT DateVal + 1,
DATENAME(dw, DateVal + 1) DateValName
FROM DayValues
WHERE DateVal + 1 <= @MaxDate
),
--select the count of days for each StartDate and EndDate pair, excluding Saturdays and Sundays
DateCounts AS(
SELECT ID,
(
SELECT COUNT(1)
FROM DayValues
WHERE DateVal BETWEEN StartDate AND EndDate
AND DateValName NOT IN ('Saturday', 'Sunday')
) DateCount
FROM @Table
)
--Now group and count
SELECT DateCount,
COUNT(ID) TotalCount
FROM DateCounts
GROUP BY DateCount
OPTION (MAXRECURSION 0)
выход
DateCount TotalCount
----------- -----------
5 2
10 1
РЕДАКТИРОВАТЬ: краткое изложение
Вам необходимо определить количество дней между (включая) 2 датами, которые не являются выходными.
Таким образом, используя CTE , я создаю временный результирующий набор дат, включающий минимальную и максимальную даты и их название дня недели (например, понедельник, вторник ... воскресенье).
Затем для каждой из ваших пар дат я подсчитываю количество записей, которые не соответствуют субботе и воскресенью.