我没有得到我需要的结果。
我想要做的就是宣布我的约会,然后我想在下一个工作日添加。即。 @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)
,但我无法得到我想要的结果。
答案 0 :(得分:1)
使用命令DATEADD:
AND TRANS_POST_DATE = DATEADD (dd, 1, @CASHDATE)--@CASHDATE+1
发挥作用;这很容易......一分钟......为了做到这一点
-- =============================================
-- 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)
您可以使用DATEDIFF
和DATEADD
功能:
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
的哪一天。在此基础上,添加必要的天数到下周一。