Oracle SQL Список интервалов - PullRequest
       3

Oracle SQL Список интервалов

0 голосов
/ 23 января 2020

Мне нужно создать новые строки интервалов на основе начального столбца даты и времени и конечного столбца даты и времени.

Мое утверждение выглядит следующим образом

select id,
startdatetime,
enddatetime
from calls

результат выглядит следующим образом

id       startdatetime                    enddatetime
1        01/01/2020 00:00:00              01/01/2020 04:00:00

Мне бы хотелось получить такой результат

id       startdatetime                    enddatetime                  Intervals
1        01/01/2020 00:00:00              01/01/2020 03:00:00          01/01/2020 00:00:00
1        01/01/2020 00:00:00              01/01/2020 03:00:00          01/01/2020 01:00:00
1        01/01/2020 00:00:00              01/01/2020 03:00:00          01/01/2020 02:00:00
1        01/01/2020 00:00:00              01/01/2020 03:00:00          01/01/2020 03:00:00

Заранее благодарю ps Я новичок в SQL

Ответы [ 2 ]

1 голос
/ 23 января 2020

Вы можете использовать рекурсивное условие факторинга подзапроса для l oop и постепенно добавлять час:

WITH times ( id, startdatetime, enddatetime, intervals ) AS (
  SELECT id,
         startdatetime,
         enddatetime,
         startdatetime
  FROM   calls c
UNION ALL
  SELECT id,
         startdatetime,
         enddatetime,
         intervals + INTERVAL '1' HOUR
  FROM   times
  WHERE  intervals + INTERVAL '1' HOUR <= enddatetime
)
SELECT *
FROM   times;

вывод:

ID | STARTDATETIME       | ENDDATETIME         | INTERVALS          
-: | :------------------ | :------------------ | :------------------
 1 | 2020-01-01 00:00:00 | 2020-01-01 04:00:00 | 2020-01-01 00:00:00
 1 | 2020-01-01 00:00:00 | 2020-01-01 04:00:00 | 2020-01-01 01:00:00
 1 | 2020-01-01 00:00:00 | 2020-01-01 04:00:00 | 2020-01-01 02:00:00
 1 | 2020-01-01 00:00:00 | 2020-01-01 04:00:00 | 2020-01-01 03:00:00
 1 | 2020-01-01 00:00:00 | 2020-01-01 04:00:00 | 2020-01-01 04:00:00

дБ <> скрипка здесь

1 голос
/ 23 января 2020

Вы можете использовать запрос hierarchy следующим образом:

SQL> WITH CALLS (ID, STARTDATETIME, ENDDATETIME)
  2  AS ( SELECT 1,
  3          TO_DATE('01/01/2020 00:00:00', 'dd/mm/rrrr hh24:mi:ss'),
  4          TO_DATE('01/01/2020 04:00:00', 'dd/mm/rrrr hh24:mi:ss')
  5      FROM DUAL)
  6  -- Your query starts from here
  7  SELECT
  8      ID,
  9      STARTDATETIME,
 10      ENDDATETIME,
 11      STARTDATETIME + ( COLUMN_VALUE / 24 ) AS INTERVALS
 12  FROM
 13      CALLS C
 14      CROSS JOIN TABLE ( CAST(MULTISET(
 15          SELECT LEVEL - 1
 16          FROM DUAL
 17          CONNECT BY LEVEL <= TRUNC(24 *(ENDDATETIME - STARTDATETIME))
 18      ) AS SYS.ODCINUMBERLIST) )
 19  ORDER BY INTERVALS;

        ID STARTDATETIME       ENDDATETIME         INTERVALS
---------- ------------------- ------------------- -------------------
         1 01/01/2020 00:00:00 01/01/2020 04:00:00 01/01/2020 00:00:00
         1 01/01/2020 00:00:00 01/01/2020 04:00:00 01/01/2020 01:00:00
         1 01/01/2020 00:00:00 01/01/2020 04:00:00 01/01/2020 02:00:00
         1 01/01/2020 00:00:00 01/01/2020 04:00:00 01/01/2020 03:00:00

SQL>

Cheers !!

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