递归地为一行中两个日期之间的每个日期创建多行

recursively creating multiple rows for every date between two dates in one row

我将员工假期 (rdos) 存储在一行中,我非常接近递归地扩展它们以显示每一天休假的完整行。 运行 这在 Postgres 数据库版本 10.10

数据集:

id |user_id|start_date|finish_date|
---|-------|----------|-----------|
412|     14|2020-10-20| 2020-10-22|
411|    137|2020-10-20| 2020-10-30|
406|     78|2020-07-18| 2020-07-18|
405|    109|2020-07-22| 2020-07-23|
403|     37|2020-06-10| 2020-06-10|

我目前的查询:

with recursive rdos(id,user_id,start_date,finish_date,dates,depth,path,cycle) AS (
select
staff_rdos.id,
staff_rdos.user_id, 
staff_rdos.start_date,
staff_rdos.finish_date,
staff_rdos.start_date::timestamp,
1,
ARRAY[staff_rdos.id::INT],
false
from staff_rdos
union all
select
staff_rdos.id,
staff_rdos.user_id, 
staff_rdos.start_date,
staff_rdos.finish_date,
rdos.dates + interval '1 day',
rdos.depth + 1,
path || rdos.depth + 1,
staff_rdos.id = ANY(path)
from rdos, staff_rdos
where rdos.dates + interval '1 day' <= staff_rdos.finish_date
and rdos.dates + interval '1 day' >= staff_rdos.start_date
and not cycle
)select * from rdos 
limit 200

我得到了重复的回归和不需要的交叉匹配。

有什么想法吗?我已经看到类似的解决方案依赖于几个月的联合 table,但我不知道这是否适用于此。

不需要递归查询来完成这样的任务在 Postgres 中:您可以只使用 generate_series() 和横向连接:

select sr.id, sr.user_id, x.vacation_date
from staff_rdoos sr
cross join lateral generate_series(sr.start_date, sr.end_date, '1 day') x(vacation_date)