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
嗨,我有一个目标想要生成 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