select 具有条件的日期范围之间的日期列表

select list of date between date range with condition

嗨,我有一个目标想要生成 2 个日期之间的日期列表,但我也有这样的条件:

Table_A:最长送货时间和休息周

Code      Max_delivery_time      Week_off
 01               4                  6

注意: Maximum_delivery_time 它包含我们可以交付物品的天数 week_off它包含每周交付的那一天不能是过程值1-7 1 = 星期一,2 = 星期二等

Table_B : Table 休息日

Code       Date_day_off 
 01         2021-26-05
 02         2021-28-05

Table B 包含如果日期在范围内则必须排除的休息日

所以我想 select 条件日期范围内的日期列表: 日期开始必须是从今天起 +1 天 完成日期是 (sysdate+1) + "Max_delivery_time"。但是,如果里面的一天包含 Week_off 中的一天和 table b date_day_off 中的日期,它将更改为第二天样本: 今天是:2021-05-24 星期一

结果会是

List_of_day
2021-05-25
2021-05-27
2021-05-30
2021-05-31

是否可以通过查询生成它?

一种方法是使用递归 cte :

with recursive cte as (
    select 
        CURRENT_DATE() List_of_day 
        , Max_delivery_time 
        , Week_off
        , 0  as counter 
        , DAYOFWEEK(CURRENT_DATE()) - 1 DAYno
        , 1 as flag 
    from Table_A ta 
    union all 
    select ADDDATE(List_of_day, 1 ) List_of_day 
        , Max_delivery_time + case when DAYOFWEEK(ADDDATE(List_of_day, 1 )) -1 = Week_off then 1 when b.code is not null then 1  else 0 end  Max_delivery_time 
        , Week_off
        , counter +1 counter
        , DAYOFWEEK(ADDDATE(List_of_day, 1 )) - 1 DAYno
        , case when DAYOFWEEK(ADDDATE(List_of_day, 1 )) - 1 = Week_off then 1 when b.code is not null then 1  else 0 end as flag 
    from cte 
    left join Table_B b on  ADDDATE(List_of_day, 1 ) = b.Date_day_off
    where counter +1 <= Max_delivery_time
)
select List_of_day from cte
where flag = 0 

db<>fiddle here