从开始日期到结束日期的每个日期行

时间:2020-10-14 12:20:50

标签: sql oracle date recursive-query

我想做的是记录一张看起来像这样的记录:

 Start_DT    End_DT     ID
4/5/2013    4/9/2013    1

并将其更改为以下形式:

    DT      ID
4/5/2013    1
4/6/2013    1
4/7/2013    1
4/8/2013    1
4/9/2013    1

它可以用Python完成,但是我不确定SQL Oracle是否可以?我很难完成这项工作。任何帮助将不胜感激。

谢谢

2 个答案:

答案 0 :(得分:1)

使用递归子查询分解子句:

WITH ranges ( start_dt, end_dt, id ) AS (
  SELECT start_dt, end_dt, id
  FROM   table_name
UNION ALL
  SELECT start_dt + INTERVAL '1' DAY, end_dt, id
  FROM   ranges
  WHERE  start_dt + INTERVAL '1' DAY <= end_dt
)
SELECT start_dt,
       id
FROM   ranges;

其中的示例数据:

CREATE TABLE table_name ( start_dt, end_dt, id ) AS
SELECT DATE '2013-04-05', DATE '2013-04-09', 1 FROM DUAL

输出:

START_DT            | ID
:------------------ | -:
2013-04-05 00:00:00 |  1
2013-04-06 00:00:00 |  1
2013-04-07 00:00:00 |  1
2013-04-08 00:00:00 |  1
2013-04-09 00:00:00 |  1

db <>提琴here

答案 1 :(得分:0)

按级别连接对于解决这些问题很有用。假设第一个名为“ table_DT ”的CTE是您的表名,因此您可以在此之后使用select语句。

with table_DT as (
    select 
        to_date('4/5/2013','mm/dd/yyyy') as Start_DT, 
        to_date('4/9/2013', 'mm/dd/yyyy') as End_DT, 
        1 as ID
    from dual
)
select 
    Start_DT + (level-1) as DT, 
    ID
from table_DT
connect by level <= End_DT - Start_DT +1
;
相关问题