Tsql 有带日期的Datetable,如果是工作日,则需要找到日期后的第11个工作日

Tsql 有带日期的Datetable,如果是工作日,则需要找到日期后的第11个工作日,tsql,Tsql,我需要找到一个日期是11个工作日后的日期 我没有日期表。请求一个,一个的准备时间很长。 使用CTE生成的结果包含日期键,如果是工作日,则为1,如果是假日,则为1,否则为0。将这些结果放入一个表变量中,现在Business_Day是(平日假日)。很多谷歌搜索已经发生了 select dt.Datekey, (dt.Weekdaycount - dt.HolidayCount) as Business_day from @DateTable dt[enter image description he

我需要找到一个日期是11个工作日后的日期

我没有日期表。请求一个,一个的准备时间很长。 使用CTE生成的结果包含日期键,如果是工作日,则为1,如果是假日,则为1,否则为0。将这些结果放入一个表变量中,现在Business_Day是(平日假日)。很多谷歌搜索已经发生了

select dt.Datekey,
(dt.Weekdaycount - dt.HolidayCount) as Business_day
from @DateTable dt[enter image description here][1]
更新,我已经在Excel中找到了它。运行工作日计数,一列工作日计数+11,然后一个Vlookup查找+11日期。现在如何在SQL中实现这一点

这样的结果 日期键 2019-01-01 营业日0 日期键 2019-01-02 营业日
1

我假设您想要设置工作日,您可以在变量表中输入假期,因此您可以执行以下操作:-

这里是周末的名字

Declare @WeekDayName1 varchar(50)='Saturday'
Declare @WeekDayName2 varchar(50)='Sunday'
设置holiday表变量,可以将其作为数据库中的特定表

Declare @Holidays table (
[Date] date,
HolidayName varchar(250)
)
让我们在一两天内插入一个测试

insert into @Holidays values (cast('2019-01-01' as date),'New Year')
insert into @Holidays values (cast('2019-01-08' as date),'some other holiday in your country')
假设您希望开始的日期是行动日期,之后需要11个工作日

Declare @ActionDate date='2018-12-28'
declare @BusinessDays int=11
一个递归CTE来计算天数,直到得到正确的天数

;with cte([date],BusinessDay) as (
    select @ActionDate [date],cast(0 as int) BusinessDay
    union all
    select dateadd(day,1,cte.[date]),
    case 
        when DATENAME(WEEKDAY,dateadd(day,1,cte.[date]))=@WeekDayName1
             OR DATENAME(WEEKDAY,dateadd(day,1,cte.[date]))=@WeekDayName2
             OR (select 1 from @Holidays h where h.Date=dateadd(day,1,cte.[date])) is not null 
                then cte.BusinessDay
                else cte.BusinessDay+1 
                end BusinessDay
     From cte where BusinessDay<@BusinessDays
    )
--to see the all the dates till business day + 11 
--select * from cte option (maxrecursion 0)
--to get the required date
select MAX([date])  from cte option (maxrecursion 0)

希望这有帮助第一步是创建一个日期表。找出工作日和周末是很容易的。工作日为1,周末为0。借用了其他人的假日日历,如果假日1其他0。那么工作日就是工作日假日=工作日。接下来是创建一个连续的总工作日。这样,你就可以从目前的跑步全天移动到将来想要的位置,比如说再加上10个工作日。在日期表中硬编码的2个和10个工作日的关键里程碑。 然后在零日和日期键上将日期表与事务表连接起来。 最后,这允许您对工作日进行可靠的计算

WHERE CONVERT(date,  D.DTRESOLVED) <= CONVERT(date, [10th_Bus_Day])  

CONVERT(date,D.DTRESOLVED)你在哪里检查了我的答案,它对你有用吗?你好,阿里,首先谢谢你尝试解决这个问题。您提供的解决方案有效,但如果更改日期,则不准确。基本上,我创建了一个日期表,然后将其加入到事务表中加入左边的[dw_dev].[dbo].[tmp_ZND_BusDay]BD(D.DTINITIATE,10)=左边的[FullDate],10),其中(CONVERT(date,D.DTRESOLVED)如果你发现你的解决方案很棒,那么我认为你需要添加你的答案并将其标记为答案(自我回答)谢谢你,阿里,我是新手:-)行。
WHERE CONVERT(date,  D.DTRESOLVED) <= CONVERT(date, [10th_Bus_Day])