有日期表,如果是工作日,需要找到日期后的第 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 个工作日的主要内容,如果未能解决你的问题,请参考以下文章

如何将条件日期参数传递给表输入步骤?

Java——获取n个工作日后的日期(这里只除去周末)

Java——获取n个工作日后的日期(这里只除去周末)

Java——获取n个工作日后的日期(这里只除去周末)

Java——获取n个工作日后的日期(这里只除去周末)

使用当月 VBA 的日期填充行中的一系列单元格,然后在下个月的第一天保存数据并清除工作表