Добавить рабочие дни к дате в SQL без циклов

В настоящее время у меня есть функция в моей базе данных SQL, которая добавляет определенное количество рабочих дней к дате, например, если вы введете date, который является четвергом, и добавить два дня, он вернет дату следующего понедельника. Меня не беспокоят праздники, исключены только выходные.

Проблема в том, что в настоящее время это делается с помощью цикла while, и, похоже, это сильно замедляет хранимую процедуру, которая использует его при создании таблицы. Кто-нибудь знает, есть ли способ выполнить это вычисление без циклов while или курсоров?

Для информации, это текущая функция:

ALTER FUNCTION [dbo].[AddWorkDaysToDate]
(   
@fromDate       datetime,
@daysToAdd      int
)
RETURNS datetime
AS
BEGIN   
DECLARE @toDate datetime
DECLARE @daysAdded integer

-- add the days, ignoring weekends (i.e. add working days)
set @daysAdded = 1
set @toDate = @fromDate

while @daysAdded <= @daysToAdd
begin
    -- add a day to the to date
    set @toDate = DateAdd(day, 1, @toDate)
    -- only move on a day if we've hit a week day
    if (DatePart(dw, @toDate) != 1) and (DatePart(dw, @toDate) != 7)
    begin
        set @daysAdded = @daysAdded + 1
    end
end

RETURN @toDate

END
33
задан Matt King 29 March 2011 в 11:07
поделиться