Sql server 使自定义项独立于日期优先设置

Sql server 使自定义项独立于日期优先设置,sql-server,user-defined-functions,Sql Server,User Defined Functions,在答案的帮助下,我创建了一个SQLServerUDF(如下所示),它返回下一个工作日(工作日),给定一个日期和要添加的天数 例如,如果日期是星期五,并且您希望添加一天,则返回值是下一个星期一的值 这取决于假定@@DATEFIRST设置为1(星期一),因为我们不能在UDF中显式设置DATEFIRST 我的问题是,我想在几个服务器上部署此函数,但它们有不同的@@DATEFIRST设置,出于生产、测试和开发服务器之间的维护目的,我宁愿只使用一个可以工作的函数,而不必担心使用了哪个@@DATEFIRST

在答案的帮助下,我创建了一个SQLServerUDF(如下所示),它返回下一个工作日(工作日),给定一个日期和要添加的天数

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

这取决于假定
@@DATEFIRST
设置为1(星期一),因为我们不能在UDF中显式设置
DATEFIRST

我的问题是,我想在几个服务器上部署此函数,但它们有不同的
@@DATEFIRST
设置,出于生产、测试和开发服务器之间的维护目的,我宁愿只使用一个可以工作的函数,而不必担心使用了哪个
@@DATEFIRST
设置。我已经花了太长时间想知道为什么我在不同的环境中得到不同的结果

如果答案只是“使用存储过程”,那么就足够公平了。 但是如果有人能建议如何重构以下内容,使之独立于
DATEFIRST
设置,那就太好了。如果DatePart(dw,@toDate)不在(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
创建函数[dbo]。[fn\u AddBusinessDays]
(   
@fromDate日期时间,
@daystoaddint
)
返回日期时间
作为
开始
声明@toDate datetime
声明@daysAdded整数
--添加天数,忽略周末(即添加工作日)
设置@daysAdded=1
设置@toDate=@fromDate

而@daysAdded如何使用周日的名称(不受
的影响。@@datefirst
):

正如martin well所指出的,这是一个警告

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

>> giovedì
如果(@@DATEFIRST+DATEPART(DW,@toDate))%7不在(0,1)
中,我认为应该适用于所有可能的
DATEFIRST


无论如何,我可能会使用辅助日历表,而不是循环自定义项。

但我认为它们取决于语言,不是吗?对不起,我现在已经阅读了问题,看看你是从哪里来的!希望这些环境至少都有相同的语言。我喜欢这种方法,这可能是我最好的选择-至少语言变化比DATEFIRST少。但是,当我的目标是在任何服务器上使用此功能而不必根据环境进行调整时,它仍然是一个潜在的“陷阱”。另外,我不能像禁止使用
SET DATEFIRST
一样在自定义项中使用
SET LANGUAGE
。DATEPART返回的值取决于SET DATEFIRST的当前设置。改变一个,你就改变了另一个。@Philip。同意。这就是为什么添加了
@@DATEFIRST
。太好了,效果非常好。重新。在日历查找解决方案中,我们使用它来考虑公共假日、非标准公司假日等,并在适当的情况下将其与通用的工作日功能相结合。
SET LANGUAGE Italian
select datename(weekday, GETDATE())

>> giovedì