有日期表,如果是工作日,需要找到日期后的第 11 个工作日
Posted
技术标签:
【中文标题】有日期表,如果是工作日,需要找到日期后的第 11 个工作日【英文标题】:Have Datetable with dates and if business day, need to find the 11th business day after a date 【发布时间】:2019-08-02 17:48:24 【问题描述】:我需要找到一个日期后 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
【问题讨论】:
你检查了我的答案,对你有用吗? 您好 Ali,第一次感谢您尝试解决这个问题。您提供的解决方案有效,但如果您更改日期,则它不准确。基本上我创建了一个日期表,然后将它加入到事务表中。 '加入 [dw_dev].[dbo].[tmp_ZND_BusDay] BD ON Left (D.DTINITIATE,10) = Left ([FullDate], 10) WHERE ( CONVERT(date, D.DTRESOLVED) 如果您发现您的解决方案很棒,那么我认为您需要添加您的答案并将其标记为答案(自我回答)。 谢谢阿里,我是新手 :-) 会的。 【参考方案1】:我假设你想设置你的工作日,你可以在变量表中输入假期,所以你可以执行以下操作:-
在这里设置周末名称
Declare @WeekDayName1 varchar(50)='Saturday'
Declare @WeekDayName2 varchar(50)='Sunday'
设置假期表变量,您可以将它作为您数据库的特定表
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)
在我的示例中,我得到的日期如下:-
ActionDate =2018-12-28
After 11 business days :2019-01-16
希望对你有帮助
【讨论】:
【参考方案2】:第一步是创建一个日期表。弄清楚工作日和周末很容易。工作日为 1,周末为 0。借用别人的假期日历,如果假期 1 则为 0。那么工作日是工作日 - 假期 = 工作日。接下来是创建一个连续的工作日总数。这使您可以从当前的任何运行总天数转移到您将来想要的位置,例如加上 10 个工作日。在日期表中硬编码关键里程碑 2 和 10 个工作日。 然后在您的零日和日期键上将您的日期表与您的事务表连接起来。 最后,这使您可以对工作日进行可靠的计算。
WHERE CONVERT(date, D.DTRESOLVED) <= CONVERT(date, [10th_Bus_Day])
【讨论】:
以上是关于有日期表,如果是工作日,需要找到日期后的第 11 个工作日的主要内容,如果未能解决你的问题,请参考以下文章