Sql 按照日期范围将数据填充到表中
我在Oracle中有一个表:Sql 按照日期范围将数据填充到表中,sql,oracle,Sql,Oracle,我在Oracle中有一个表: select * from leave; --LEAVE_DTL_ID is auto incremented LEAVE_DTL_ID STAFF_ID START_DT END_DT ------------ ---------- --------- --------- 49
select * from leave;
--LEAVE_DTL_ID is auto incremented
LEAVE_DTL_ID STAFF_ID START_DT END_DT
------------ ---------- --------- ---------
49 654 21-JAN-19 23-JAN-19
186 55 02-MAY-19 06-MAY-19
280 354 09-JUN-19 14-JUN-19
我想根据相应的日期范围,将START_DT和END_DT列合并为一个名为“DATES”的列
例如:请假它的开始日期为“19年5月2日”,结束日期为“19年5月6日”
我想将数据填充为
LEAVE_DTL_ID STAFF_ID DATES
------------ ---------- ---------
186 55 02-MAY-19
187 55 03-MAY-19
188 55 04-MAY-19
189 55 05-MAY-19
190 55 06-MAY-19
有什么方法可以做到这一点吗?您是否专门寻找一个查询?或者你对程序也满意吗?@DockYard:两者都会有帮助。很好-我喜欢加入多集以避免重复的部分…对;它的性能比DISTINCT好,@RADAGAST是的,特别是当您想在应用程序中使用联接或筛选器进一步处理数据时,使用这种方法很好,这样oracle就可以使用索引进行筛选等。我个人更喜欢交叉联接而不是联接。。。在1=1时。我不知道这是否真的有区别,但我觉得1=1仍然是一个需要评估的条件,因此交叉连接只需花费很少的额外时间。@Littlefoot:谢谢你对这个问题的宝贵回答。这为我节省了很多时间。
SQL> with leave (leave_dtl_id, staff_id, start_dt, end_dt) as
2 (select 49, 654, date '2019-01-21', date '2019-01-23' from dual union all
3 select 186, 55, date '2019-05-02', date '2019-05-06' from dual
4 )
5 select
6 (leave_dtl_id + column_value - 1) as leave_dtl_id,
7 staff_id,
8 (start_dt + column_value - 1) as dates
9 from leave cross join
10 table(cast(multiset(select level from dual
11 connect by level <= end_dt - start_dt + 1
12 ) as sys.odcinumberlist))
13 order by staff_id, dates;
LEAVE_DTL_ID STAFF_ID DATES
------------ ---------- --------
186 55 02.05.19
187 55 03.05.19
188 55 04.05.19
189 55 05.05.19
190 55 06.05.19
49 654 21.01.19
50 654 22.01.19
51 654 23.01.19
8 rows selected.
SQL>