Reputation: 87
I'm not getting the results that I need.
All I want to do is declare my date and then I want add the next business day to it. ie. @CASHDATE+1
(this works) but I need the next business day being 5th.
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.
Any ideas on how to achieve this would be welcome. I've been experimenting with DATEPART(dw, @CASHDATE) NOT IN (1, 7)
but I just can't get the result I want.
Upvotes: 2
Views: 7165
Reputation: 713
Use the command DATEADD:
AND TRANS_POST_DATE = DATEADD (dd, 1, @CASHDATE)--@CASHDATE+1
make a function; It's easy... gime a minute... to make it
-- =============================================
-- 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
Create the function and change your code:
AND TRANS_POST_DATE = dbo.GetBussinesDay( @CASHDATE)--@CASHDATE+1
Also, you can change the bussines days in the function... for futures changes or rules.
Upvotes: 1
Reputation: 31879
You can make use of the DATEDIFF
and DATEADD
function:
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
)
The DATEDIFF(DAY, 0, @CASHDATE) % 7
determines what day @CASHDATE
is. Based on that, add the necessary number of days up to the next Monday.
Upvotes: 0
Reputation: 14361
DATEADD(day,
CASE
WHEN DATENAME(dw,CASHDATE) = 'Friday' THEN 3
WHEN DATENAME(dw,CASHDATE) = 'Saturday' THEN 2
ELSE 1
END,
CASHDATE)
Here is an example to show you how it would calculate
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
One of the considerations you need to think about when using DATEPART(dw,Date)
is what the DATEFRIST setting is. By Comparing with DATENAME you don't have to worry about that.
Upvotes: 4