gpt4 book ai didi

sql - 我可以在迭代中添加额外的步骤吗?

转载 作者:行者123 更新时间:2023-12-04 22:33:51 26 4
gpt4 key购买 nike

我有一个函数应该计算给定日期之前或之后的 x 个工作日(不包括周末和节假日)。

问题是,当最后一天是周末或工作日时,它不会添加额外的迭代...

SELECT afidb.dbo.AddBusinessDays(-21,'11/08/2016') 

上面应该返回 2016-10-7,但返回 2016-10-10。 10月10日放假,前两天是周末。

我认为这是因为在最后一次迭代中,@bdays = 0 所以它退出并且没有添加额外的步骤。

我是不是错了,还是有其他问题?

ALTER FUNCTION [dbo].[Addbusinessdays] (
@bDays INT -- number of business days to add sub.
,@d DATETIME -- variable to hold the date you want to add or sub days to
)
RETURNS DATE
AS
BEGIN
DECLARE @nDate DATETIME -- the working date
,@addsub INT -- factor for add or sub

SET @ndate = @d

IF @bdays > 0
SET @addsub = 1
ELSE
SET @addsub = - 1

WHILE @bdays <> 0 -- Keep adding/subtracting a day until @bdays becomes 0
BEGIN
-- incr or decr @ndate
SELECT @bdays = CASE
WHEN (@@datefirst + Datepart(weekday, @ndate)) % 7 IN ( 0 ,1 ) -- ignore if it is Sat or Sunday
THEN CASE
WHEN @bDays = 0
THEN @bdays + 1 * @addsub
ELSE @bDays
END
WHEN (
SELECT Count(*)
FROM dbo.tblholidays
WHERE holidaydate = @nDate
) > 0
-- ignore if it is in the holiday table
THEN CASE
WHEN @bDays = 0
THEN @bdays + 1 * @addsub
ELSE @bDays
END
ELSE @bdays - 1 * @addsub -- incr or decr @ndate
END

SET @ndate = Dateadd(day, 1 * @addsub, @ndate)
END

RETURN Cast(@nDate AS DATE)
END

最佳答案

您需要在 while 循环结束时进行额外检查,以确保您不会在非工作日着陆。在你 SET @ndate = Dateadd(day, 1 * @addsub, @ndate) 之后,你必须再次检查 @ndate。如果是非工作日,增加或减少@bdays 以便再次进入循环。

关于sql - 我可以在迭代中添加额外的步骤吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43503979/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com