Создать диапазон дат из двух столбцов даты - PullRequest
2 голосов
/ 04 апреля 2019

Исходная таблица выглядит следующим образом:

Id   start_date   end_date    field1
1    01/03/2019   07/03/2019  text1
2    10/04/2019   15/04/2019  text2

Я хотел бы получить этот вывод:

Id date        field1
1  01/03/2019  text1
1  02/03/2019  text1
1  03/03/2019  text1
1  04/03/2019  text1
1  05/03/2019  text1
1  06/03/2019  text1
1  07/04/2019  text1
2  10/04/2019  text2
2  11/04/2019  text2
2  12/04/2019  text2
2  13/04/2019  text2
2  14/04/2019  text2
2  15/04/2019  text2

Я должен использовать цикл для заполнения этой таблицы?

Спасибо

Ответы [ 2 ]

6 голосов
/ 04 апреля 2019

Вы можете использовать запрос connect by, используя prior + sys_guid() трюк

select id,start_date + level - 1 as "date", field1 from t 
connect by level <= end_date - start_date  + 1
    and prior id = id
and prior sys_guid() is not null;

DEMO

1 голос
/ 04 апреля 2019

Вы можете использовать рекурсивный CTE, который является стандартом SQL. Например, CTE expanded в следующем запросе работает как в Oracle, так и в Postgres (весь запрос работает только в Oracle, будет работать в Postgres после удаления from dual и добавления with recursive):

with original as (
  select 1 as id, date '2019-03-01' as start_date, date '2019-03-07' as end_date, 'text1' as field from dual
  union
  select 2 as id, date '2019-04-10' as start_date, date '2019-04-15' as end_date, 'text2' as field from dual
), expanded (id, the_date, end_date, field) as (
  select id, start_date, end_date, field
  from original
  union all
  select original.id, expanded.the_date + 1, original.end_date, original.field
  from expanded
  join original on expanded.id = original.id and expanded.the_date + 1 <= original.end_date
)
select id, the_date, field
from expanded
order by id, the_date

См. https://dbfiddle.uk/?rdbms=oracle_18&fiddle=c0e49c2fff9e24fee8401e8ac9a16ceb

Примечание: из-за арифметической ошибки датировки Oracle CTE запрос не будет работать в Oracle до 11.2 (вы получаете ошибку ORA-01841: (full) year must be between -4713 and +9999, and not be 0, поскольку даты ошибочно идут вниз). Если у вас более старая версия Oracle, вам, вероятно, лучше использовать connect by, так как использование CTE требует некоторого обходного пути для ошибки (обратное направление или предварительно вычисленные последовательности), что тоже сложно. Для более новой версии Oracle (или других поставщиков - если кто-то найдет этот вопрос) я рекомендую предпочесть стандарт SQL.

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