Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按照日期范围将数据填充到表中_Sql_Oracle - Fatal编程技术网

Sql 按照日期范围将数据填充到表中

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

我在Oracle中有一个表:

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>