1

我有下表数据:

编号 FROM_DATE TO_DATE
1 2018 年 1 月 2 日 2018 年 5 月 2 日
2 2018 年 6 月 2 日 2018 年 10 月 2 日

我需要从该表中选择数据:

ID Day_Date
1 2018 年 1 月 2 日
1 2018 年 2 月 2 日
1 2018 年 3 月 2 日
1 2018 年 4 月 2 日
1 2018 年 5 月 2 日
2 2018 年 6 月 2 日
2 2018 年 7 月 2 日
2 2018 年 8 月 2 日
2 2018 年 9 月 2 日
2 2018 年 10 月 2 日

所以有可能在 oracle 数据库中得到这个结果?!

4

3 回答 3

2

您可以使用connect by level具有 as 贡献的子句cross join

with t(ID,from_date,to_date) as
(
 select 1, date'2018-02-01', date'2018-02-05' from dual union all
 select 2, date'2018-02-06', date'2018-02-10' from dual
)
select ID, min(from_date) + level - 1 as "Day_Date"
  from dual cross join t
 connect by level <= to_date - from_date + 1  
 group by ID, from_date, level
 order by ID;

Rextester 演示

于 2018-10-14T14:21:09.117 回答
2

尝试内部加入包含日期的日历表,以针对当前表覆盖数据中的所有内容:

WITH dates AS (
    SELECT TRUNC (SYSDATE - ROWNUM) dt
    FROM DUAL CONNECT BY ROWNUM < 366
)

SELECT
    t.ID, d.dt AS Day_Date
FROM dates d
INNER JOIN yourTable t
    ON d.dt BETWEEN t.FROM_DATE AND t.TO_DATE
ORDER BY
    d.dt;

在此处输入图像描述

演示

于 2018-10-14T14:16:51.890 回答
0

另一种变体可能是使用流水线表函数,其中开始和结束日期作为输入包声明:

create or replace package tst_pkg as 
  type xx is table of date; 
  function get_days (start_date date, end_date date) return xx pipelined; 
end tst_pkg;

包体:

CREATE OR REPLACE
PACKAGE BODY TST_PKG AS

  function get_days (start_date date, end_date date) return xx pipelined AS
  BEGIN
    for xx in 0 .. (end_date - start_date) loop 
      pipe row (trunc(start_date + xx)); 
    end loop; 
  END get_days;

END TST_PKG;

查询将类似于下面的查询

select id, column_value from emp, table(tst_pkg.get_days(start_date, end_date)) ;
于 2018-10-14T18:10:33.143 回答