Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Разделить записи на 2 части.  [new]
proxy_911
Member

Откуда:
Сообщений: 214
Добрый день коллеги,
Есть таблица t1 которые содержит одно записи.
ID         start_stime                       end_time 
1          05.03.2019 10:00:00        04.05.2019 10:00:00


Соответственно между start_stime и end_time ровно 60 дней.
Не подскажите как мне вывести из одной записи 2 запись с SELECT -ом, т.е интервал разделить по 30-и дней.
Результат должен выглядит вот так:

ID         start_stime                       end_time 
1          05.03.2019 10:00:00        04.04.2019 10:00:00
1          04.04.2019 10:00:00        04.05.2019 10:00:00


Буду благодарен за каждый ответь, заранее спасибо.
5 апр 19, 15:58    [21854196]     Ответить | Цитировать Сообщить модератору
 Re: Разделить записи на 2 части.  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9395
SQL> WITH DATA AS (
  2                SELECT  TO_DATE('05.03.2019 10:00:00','DD.MM.YYYY HH24:MI:SS') START_TIME,
  3                        TO_DATE('04.05.2019 10:00:00','DD.MM.YYYY HH24:MI:SS') END_TIME
  4                  FROM  DUAL
  5               )
  6  SELECT  START_TIME + 30 * (L - 1) START_TIME,
  7          LEAST(END_TIME,END_TIME + 30 * L) END_TIME
  8    FROM  DATA,
  9          LATERAL(
 10                  SELECT  LEVEL L
 11                    FROM  DUAL
 12                    CONNECT BY LEVEL <= CEIL((END_TIME - START_TIME) / 30)
 13                 )
 14  /

START_TIME          END_TIME
------------------- -------------------
05.03.2019 10:00:00 04.05.2019 10:00:00
04.04.2019 10:00:00 04.05.2019 10:00:00

SQL> 


SY.
5 апр 19, 16:25    [21854239]     Ответить | Цитировать Сообщить модератору
 Re: Разделить записи на 2 части.  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9395
OOPS:

WITH DATA AS (
              SELECT  TO_DATE('05.03.2019 10:00:00','DD.MM.YYYY HH24:MI:SS') START_TIME,
                      TO_DATE('04.05.2019 10:00:00','DD.MM.YYYY HH24:MI:SS') END_TIME
                FROM  DUAL
             )
SELECT  START_TIME + 30 * (L - 1) START_TIME,
        LEAST(END_TIME,START_TIME + 30 * L) END_TIME
  FROM  DATA,
        LATERAL(
                SELECT  LEVEL L
                  FROM  DUAL
                  CONNECT BY LEVEL <= CEIL((END_TIME - START_TIME) / 30)
               )
/

START_TIME          END_TIME
------------------- -------------------
05.03.2019 10:00:00 04.04.2019 10:00:00
04.04.2019 10:00:00 04.05.2019 10:00:00

SQL> 


SY.
5 апр 19, 16:30    [21854244]     Ответить | Цитировать Сообщить модератору
 Re: Разделить записи на 2 части.  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9395
Код я дал разбивает по 30 дней независимо сколько дней между START_TIME и END_TIME. Если 60 всегда, то можно упростить:

WITH DATA AS (
              SELECT  TO_DATE('05.03.2019 10:00:00','DD.MM.YYYY HH24:MI:SS') START_TIME,
                      TO_DATE('04.05.2019 10:00:00','DD.MM.YYYY HH24:MI:SS') END_TIME
                FROM  DUAL
             ),
   DOUBLE AS (
              SELECT  LEVEL L
                FROM  DUAL
                CONNECT BY LEVEL <= 2
             )
SELECT  START_TIME + 30 * (L - 1) START_TIME,
        LEAST(END_TIME,START_TIME + 30 * L) END_TIME
  FROM  DATA,
        DOUBLE
/

START_TIME          END_TIME
------------------- -------------------
05.03.2019 10:00:00 04.04.2019 10:00:00
04.04.2019 10:00:00 04.05.2019 10:00:00

SQL> 


SY.
5 апр 19, 16:35    [21854250]     Ответить | Цитировать Сообщить модератору
 Re: Разделить записи на 2 части.  [new]
Fogel
Member

Откуда:
Сообщений: 343
SY
Если 60 всегда, то можно упростить


select id, start_stime, start_stime+30 as end_time from t
union all
select id, start_stime+31, end_time from t
order by 1, 2
6 апр 19, 13:25    [21854673]     Ответить | Цитировать Сообщить модератору
 Re: Разделить записи на 2 части.  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9395
Fogel
SY
Если 60 всегда, то можно упростить


select id, start_stime, start_stime+30 as end_time from t
union all
select id, start_stime+31, end_time from t
order by 1, 2


То есть ты считаешь два TABLE ACCESS FULL таблицы DATA лучше чем один и DOUBLE в моем решении тяжелее TABLE ACCESS FULL таблицы DATA?

SY.
6 апр 19, 14:06    [21854688]     Ответить | Цитировать Сообщить модератору
 Re: Разделить записи на 2 части.  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28823
SY
То есть ты считаешь
Fogel - это придурковатый тролль. Модератор обязан в этом ориентироваться.
7 апр 19, 11:07    [21855006]     Ответить | Цитировать Сообщить модератору
 Re: Разделить записи на 2 части.  [new]
proxy_911
Member

Откуда:
Сообщений: 214
Огромное Спасибо коллеги,
Получилось со второго запроса, Между Start_time и end_time не всегда 60 дней, может быть и 90,120 и т.д.
Благодарю за помощь SY.
8 апр 19, 07:27    [21855399]     Ответить | Цитировать Сообщить модератору
 Re: Разделить записи на 2 части.  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1711
SY
Fogel
пропущено...


select id, start_stime, start_stime+30 as end_time from t
union all
select id, start_stime+31, end_time from t
order by 1, 2


То есть ты считаешь два TABLE ACCESS FULL таблицы DATA лучше чем один и DOUBLE в моем решении тяжелее TABLE ACCESS FULL таблицы DATA?

SY.


імхо
Запросы решают разные задачи

если делить токо на два интервала ("из одной записи 2 запись"),
то вместо CONNECT BY можно использаовать более легкую конструкцию

.....
stax
8 апр 19, 10:56    [21855592]     Ответить | Цитировать Сообщить модератору
 Re: Разделить записи на 2 части.  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9395
Stax

если делить токо на два интервала ("из одной записи 2 запись"),
то вместо CONNECT BY можно использаовать более легкую конструкцию

.....
stax


Может покажешь?

SY.
8 апр 19, 13:28    [21855839]     Ответить | Цитировать Сообщить модератору
 Re: Разделить записи на 2 части.  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1711
SY

Может покажешь?

SY.

а шо там показывать

select 1 L from dual union all select 2 from dual
или
select rownum l from my_table where rownum<=2

....
stax
8 апр 19, 16:21    [21856156]     Ответить | Цитировать Сообщить модератору
 Re: Разделить записи на 2 части.  [new]
Fogel
Member

Откуда:
Сообщений: 343
SY
Fogel
пропущено...

select id, start_stime, start_stime+30 as end_time from t
union all
select id, start_stime+31, end_time from t
order by 1, 2


То есть ты считаешь два TABLE ACCESS FULL таблицы DATA лучше чем один и DOUBLE в моем решении тяжелее TABLE ACCESS FULL таблицы DATA?

SY.


Стас уже всё сказал.
Если там всего 30 тыс записей (к примеру), и, как было первоначально озвучено, 60 дней, не нужно множить сущности без необходимости.
Но автор уже сказал, что не 60 дней и поблагодарил. Поэтому, чего уж.
9 апр 19, 22:32    [21857768]     Ответить | Цитировать Сообщить модератору
 Re: Разделить записи на 2 части.  [new]
Fogel
Member

Откуда:
Сообщений: 343
Elic
SY
То есть ты считаешь
Fogel - это придурковатый тролль. Модератор обязан в этом ориентироваться.


Модераторы просто обязаны ориентироваться, что Элик только что заоффтопил и меня оскорбил, чем нарушил правила форума )))

Сколько желчи в непризнанных гениях набирается, ужас просто.
9 апр 19, 22:34    [21857770]     Ответить | Цитировать Сообщить модератору
 Re: Разделить записи на 2 части.  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28823
Fogel
меня оскорбил
Оскорбить можно личность, но не тролле-проект. Паспорт продемонстрируешь?
Fogel
Сколько желчи в непризнанных гениях набирается, ужас просто.
Ты, недалёкий, многих вещей самовлюблённо не видишь.
10 апр 19, 07:56    [21857908]     Ответить | Цитировать Сообщить модератору
 Re: Разделить записи на 2 части.  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1711
Fogel
Стас уже всё сказал.
Если там всего 30 тыс записей (к примеру), и, как было первоначально озвучено, 60 дней, не нужно множить сущности без необходимости.
Но автор уже сказал, что не 60 дней и поблагодарил. Поэтому, чего уж.


А поговорить

імхо
я скорее на строне SY, два скана возможно хуже чем картезиан с двумя строками

и раз уж начали ловить блог, то предложил заменить соннест бау на более (как мне кажется) конструкцию
мож еще луче на что-то без обращения к табличке, аля sys.odcinumberlist, или какую-то легкую v$

.....
stax
10 апр 19, 10:47    [21858056]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить