使UDF独立于DATEFIRST设置

Wid*_*dor 2 sql-server user-defined-functions

在SO的答案的帮助下,我创建了一个SQL Server UDF(下面),它返回下一个工作日(工作日),给定日期和添加天数.

例如,如果日期是星期五,并且您想要添加一天,则返回值是下一个星期一的值.

这依赖于假设@@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
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 5

IF (@@DATEFIRST + DATEPART(DW, @toDate)) % 7 not in (0,1)DATEFIRST我认为应该适用于所有可能的价值观.

我可能会使用Auxilliary Calendar表而不是循环UDF.

  • @Philip.同意.这就是添加"@@ DATEFIRST"的原因. (2认同)