С помощью ответов на SO я создал UDF SQL Server (ниже), который возвращает следующий рабочий день (рабочий день), учитывая дату и количество дней для добавления.
Например, если дата - пятница, и вы не хотите добавлять один день, возвращаемое значение соответствует значению следующего понедельника.
Предполагается, что для @@DATEFIRST
установлено значение 1 (понедельник), поскольку мы не можем явно установить DATEFIRST
в UDF.
Моя проблема в том, что я хотел бы развернуть эту функцию на нескольких серверах, но у них разные настройки @@DATEFIRST
и для целей обслуживания между производственным, тестовым и разработочным серверами. Я бы предпочел иметь только одну функцию, которая работала бы без необходимости беспокоиться о том, какая настройка @@DATEFIRST
используется. Я уже слишком долго задавался вопросом, почему я получаю разные результаты в разных средах!
Если ответ просто «использовать сохраненный процесс», то достаточно справедливо.
Но если кто-нибудь может подсказать, как выполнить рефакторинг следующего, чтобы он не зависел от настройки DATEFIRST
, это было бы здорово. Значимая линия, вероятно, будет if DatePart(dw, @toDate) not in (6, 7)...
Определение функции:
CREATE FUNCTION [dbo].[fn_AddBusinessDays]
(
@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) not in (6, 7)
begin
set @daysAdded = @daysAdded + 1
end
end
RETURN @toDate
END