2016-12-06 67 views
0

我没有得到我需要的结果。申报日期,然后再添加下一个营业

所有我想做的事就是我的申报日期,然后我想下一个工作日添加到它。即。 @CASHDATE+1(这工作),但我需要下一个工作日是第五。

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),但我无法得到我想要的结果。

+0

感谢所有发布您的解决方案,他们是完美的!我现在可以完成我的现金流量报告。 – Mandy

回答

0

命令DATEADD:

AND TRANS_POST_DATE = DATEADD (dd, 1, @CASHDATE)[email protected]+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)[email protected]+1 

此外,您还可以改变bussines天的功能...期货变化或规则。

0
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比较,您不必担心这一点。

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是什么日子。基于此,将必要的天数添加到下一个星期一。

相关问题