首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以在迭代中增加一个额外的步骤吗?

我可以在迭代中增加一个额外的步骤吗?
EN

Stack Overflow用户
提问于 2017-04-19 18:58:09
回答 1查看 39关注 0票数 3

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

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

代码语言:javascript
复制
SELECT afidb.dbo.AddBusinessDays(-21,'11/08/2016') 

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

我认为这是因为在最后一次迭代中,@bdays = 0退出,不添加额外的步骤。

我是不是弄错了,还是还有别的问题呢?

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-19 19:50:59

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43503979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档