Вы можете сделать это с помощью CTE, и это легко можно превратить в скалярную функцию:
DECLARE @startDate DATETIME = '2011-09-01'
DECLARE @endDate DATETIME = '2011-09-23'
;WITH DateRange (date) AS
(
SELECT @startDate
UNION ALL
SELECT Date+1
FROM DateRange
WHERE date<@endDate
)
SELECT COUNT(*) FROM DateRange WHERE DATENAME(dw,Date) != 'Sunday'
Возвращает 20
, которое является количеством дней в этом месяце, которые не являются воскресеньями.
Вот эквивалентная функция, которую можно использовать:
CREATE FUNCTION dbo.NumberOfDaysExcludingSunday(
@startDate DATETIME,
@endDate DATETIME
) RETURNS INT AS
BEGIN
DECLARE @rtn INT
;WITH DateRange (date) AS
(
SELECT @startDate
UNION ALL
SELECT Date+1
FROM DateRange
WHERE date<@endDate
)
SELECT @rtn = COUNT(*) FROM DateRange WHERE DATENAME(dw,Date) != 'Sunday'
RETURN @rtn
END
Использование:
SELECT dbo.NumberOfDaysExcludingSunday(startDate,endDate)
FROM myTable