выберите дату дней между столбцами таблицы from_date и to_date - PullRequest
0 голосов
/ 14 октября 2018

У меня есть следующие данные таблицы как:

ID       FROM_DATE     TO_DATE
1        01/02/2018    05/02/2018
2        06/02/2018    10/02/2018

Мне нужно выбрать данные из этой таблицы как:

ID      Day_Date
1       01/02/2018
1       02/02/2018
1       03/02/2018
1       04/02/2018
1       05/02/2018
2       06/02/2018
2       07/02/2018
2       08/02/2018
2       09/02/2018
2       10/02/2018

, чтобы можно было получить этот результат в базе данных оракула?!

Ответы [ 3 ]

0 голосов
/ 14 октября 2018

Вы можете использовать предложение connect by level с вкладом 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 Demo

0 голосов
/ 14 октября 2018

Другим вариантом может быть использование конвейерной табличной функции с начальной и конечной датами в качестве входных данных. Объявление пакета:

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)) ;
0 голосов
/ 14 октября 2018

Попробуйте внутреннее присоединение к календарной таблице, содержащей даты, чтобы охватить все в ваших данных относительно вашей текущей таблицы:

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;

enter image description here

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...