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

时间:2016-12-06 00:10:05

标签: sql sql-server

我没有得到我需要的结果。

我想要做的就是宣布我的约会,然后我想在下一个工作日添加。即。 @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),但我无法得到我想要的结果。

3 个答案:

答案 0 :(得分:1)

使用命令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  

此外,您可以更改函数中的商务天数...以进行期货变更或规则。

答案 1 :(得分: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比较,您不必担心这一点。

答案 2 :(得分:0)

您可以使用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的哪一天。在此基础上,添加必要的天数到下周一。