У меня нет удобной таблицы праздничных дней, поэтому я не очень проверял это - но, поскольку никто другой не пытался ответить, вот как я начну:
declare @tempDate datetime,
@StartDate datetime,
@WorkingDays int,
@NonWorkingDays int,
@TargetDate datetime
set @StartDate = '2010-10-26' --Change this to a paramter
set @WorkingDays = 9 --Change this to a parameter
set @NonWorkingDays = -1
/*Work out the answer ignoring holidays */
set @tempDate = dateadd(d,@WorkingDays,@StartDate)
while (dateadd(d,@WorkingDays + @NonWorkingDays, @StartDate) < @tempDate)
begin
/*Work out how many holidays are in the interval we've worked out*/
select @NonWorkingDays = count(HolidayDate)
from Holidays
where HolidayDate between @StartDate and @tempDate;
/*Extend the interval to include the holidays we've just found*/
set @tempDate = dateadd(d,@NonWorkingDays,@tempDate)
/*See if @NonWorkingDays has changed with the new @tempDate*/
select @NonWorkingDays = count(HolidayDate)
from Holidays
where HolidayDate between @StartDate and @tempDate;
end
set @TargetDate = dateadd(d,@WorkingDays + @NonWorkingDays, @StartDate)
print 'Target Date: ' + cast(@TargetDate as varchar(50))
Обратите внимание, что на данный момент это работает только в праздничные дни, а не в выходные дни. Вам нужно будет загрузить все выходные в таблицу выходных (или присоединиться к таблице выходных, или использовать функцию DATENAME), но расчет должен быть таким же.
Не уверен, как ваш праздничный стол обрабатывает повторяющиеся даты (например, День подарков и день Святого Стефана приходятся на 26 декабря), поэтому вам, возможно, придется учесть это.