Функция TSQL для расчета 30 рабочих дней с указанной даты (SQL Server 2005) - PullRequest
2 голосов
/ 26 октября 2010

TSQL Функция для расчета 30 рабочих дней Дата с указанной даты (SQL Server 2005)?

Входными параметрами будут Дата и Количество рабочих дней.
Результатом будет рассчитанная дата.

Это исключает субботу, воскресенье, праздничные дни и дневные праздники.
Т.е. если праздник выпадает на выходные, но он отмечается в пятницу или понедельник после праздника.

Для праздников у нас есть таблица с праздником и днем, когда отмечается дата.

Ответы [ 4 ]

2 голосов
/ 26 октября 2010

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

1 голос
/ 26 октября 2010

У меня нет удобной таблицы праздничных дней, поэтому я не очень проверял это - но, поскольку никто другой не пытался ответить, вот как я начну:

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 декабря), поэтому вам, возможно, придется учесть это.

1 голос
/ 26 октября 2010

Вместо написания функции tsql может оказаться проще, если вы создадите таблицу, аналогичную таблице «Измерение даты» (DimDate) в хранилище данных.DimDate будет содержать столбец с именем isHoliday.Вы также можете добавить другие столбцы, которые могут быть полезны.Затем вы пишете сценарий для заполнения DimDate

Затем вы можете выполнить запрос из него.

1 голос
/ 26 октября 2010

В онлайн-справке SQL есть одно право, если вы прокрутите вниз до UDF, чтобы вернуть количество рабочих дней, включая чек в таблицу банковских выходных. Вы можете настроить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...