繁体   English   中英

声明日期,然后添加下一个工作日

[英]Declare date, then add next business day

我没有得到所需的结果。

我要做的就是声明我的日期,然后再添加下一个工作日。 即。 @CASHDATE+1 (此方法有效),但我需要下一个工作日为5日。

DECLARE  @CASHDATE DATETIME
SET @CASHDATE='2016-12-02'

SELECT <<COLUMN_NAME>>  FROM <<TABLE_NAME>> 
WHERE RECEIVED_DATE = @CASHDATE /*'2016-12-02'*/ 
AND TRANS_POST_DATE = @CASHDATE+1 /*'2016-12-05'*/) <== I don't want it to be '2016-12-03 or 04', I'm trying to get the next business day. 

任何关于如何实现这一目标的想法都将受到欢迎。 我一直在尝试DATEPART(dw, @CASHDATE) NOT IN (1, 7)但我只是无法获得想要的结果。

使用命令DATEADD:

AND TRANS_POST_DATE = DATEADD (dd, 1, @CASHDATE)--@CASHDATE+1  

DATEADD(Transact-SQL)

发挥作用 一分钟很容易...

-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date, ,>
-- Description: <Description, ,>
-- =============================================
/*

declare @date datetime 
set @date = '2016-12-10'

declare @newDate datetime
select  @newDate = dbo.[GetBussinesDay](@date)

select @date, @newDate 

*/
create FUNCTION [dbo].[GetBussinesDay]
(
    @Date as datetime
)
RETURNS datetime
AS
BEGIN
    declare @NewDate datetime

    declare @BussinessDays table ( bDay int)
    insert into @BussinessDays VALUES (2) --mon
    insert into @BussinessDays VALUES (3) --Tue
    insert into @BussinessDays VALUES (4) --Wed
    insert into @BussinessDays VALUES (5) --Thu
    insert into @BussinessDays VALUES (6) --Fri

    if exists(select bDay from @BussinessDays where bDay = DATEPART(dw,@Date))
    begin
        set @NewDate = @Date;
    end
    else
    begin
        set @NewDate = dbo.GetBussinesDay(dateadd(dd,1,@Date));
    end

    return @NewDate

END

创建函数并更改代码:

AND TRANS_POST_DATE =  dbo.GetBussinesDay( @CASHDATE)--@CASHDATE+1  

另外,您可以在功能中更改商务日...以更改期货或规则。

DATEADD(day,
    CASE
       WHEN DATENAME(dw,CASHDATE) = 'Friday' THEN 3
       WHEN DATENAME(dw,CASHDATE) = 'Saturday' THEN 2
       ELSE 1
    END,
    CASHDATE)

这是一个示例,向您展示如何计算

DECLARE @Dates AS TABLE (CASHDATE DATETIME)
INSERT INTO @Dates VALUES ('2016-11-28'),('2016-11-29'),('2016-11-30'),('2016-12-01'),('2016-12-02'),('2016-12-03'),('2016-12-04')

;WITH cteNextBizDays AS (
    SELECT
       CASHDATE
       ,NextBusinessDay = DATEADD(day,
          CASE
             WHEN DATENAME(dw,CASHDATE) = 'Friday' THEN 3
             WHEN DATENAME(dw,CASHDATE) = 'Saturday' THEN 2
             ELSE 1
          END
          ,CASHDATE)
    FROM
       @Dates
)

SELECT
    CASHDATE
    ,DATENAME(dw,CASHDATE) CashDateDayOfWeek
    ,NextBusinessDay
    ,DATENAME(dw,NextBusinessDay) NextBusinessDayDayofWeek
FROM
    cteNextBizDays

使用DATEPART(dw,Date)时需要考虑的考虑因素之一是DATEFRIST设置。 与DATENAME相比,您不必担心。

您可以使用DATEDIFFDATEADD函数:

DECLARE @CASHDATE datetime='2016-12-03' 
SELECT
    CashDate = @CASHDATE,
    NextBusinessDay = 
        DATEADD(DAY,
                CASE 
                    WHEN DATEDIFF(DAY, 0, @CASHDATE) % 7 > 3 
                        THEN 7 - DATEDIFF(DAY, 0, @CASHDATE) % 7 
                    ELSE 1 
                END,
                @CASHDATE
        )

DATEDIFF(DAY, 0, @CASHDATE) % 7确定@CASHDATE是星期@CASHDATE 在此基础上,添加下一个星期一之前的必要天数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM