Сделать UDF независимым от установки DATEFIRST - PullRequest
2 голосов
/ 12 мая 2011

С помощью ответов на 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

Ответы [ 2 ]

5 голосов
/ 12 мая 2011

IF (@@DATEFIRST + DATEPART(DW, @toDate)) % 7 not in (0,1) должно работать для всех возможных DATEFIRST значений, я думаю.

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

2 голосов
/ 12 мая 2011

Как насчет использования названий дней недели (на которые не влияет @@datefirst):

if left(datename(weekday, @toDate), 3) in ('Sat', 'Sun')
 ...

В качестве предостережения, на которое хорошо указывает Мартин;

SET LANGUAGE Italian
select datename(weekday, GETDATE())

>> giovedì
...