powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Интервалы дат
19 сообщений из 19, страница 1 из 1
Интервалы дат
    #39699426
Dimets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В таблице несколько записей с интервалами дат:
22.09.18 10.10.18
23.09.18 11.10.18
24.09.18 12.10.18
25.09.18 13.10.18
26.09.18 14.10.18
27.09.18 15.10.18
23.10.18 10.11.18
24.10.18 11.11.18

Нужно "схлопнуть" пересекающиеся интервалы, в данном примере должно получиться на выходе запроса:
22.09.18 15.10.18
23.10.18 11.11.18

Подскажите как написать запрос?
...
Рейтинг: 0 / 0
Интервалы дат
    #39699428
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Интервалы дат
    #39699431
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimets,

хотя, в вашем случае всё гораздо проще:
группировать по разности между датой и row_number-ом в сортировке по этой самой дате... так сказать, по "инварианту группы"...
тоже, кстати можно поискать на форуме , если что...
...
Рейтинг: 0 / 0
Интервалы дат
    #39699439
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина АннаDimets,

хотя, в вашем случае всё гораздо проще:
группировать по разности между датой и row_number-ом в сортировке по этой самой дате... так сказать, по "инварианту группы"...
тоже, кстати можно поискать на форуме , если что...таки нет. у вас же интервалы, а не последовательный список дат...
...
Рейтинг: 0 / 0
Интервалы дат
    #39699445
Dimets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина АннаDimets,

хотя, в вашем случае всё гораздо проще:
группировать по разности между датой и row_number-ом в сортировке по этой самой дате... так сказать, по "инварианту группы"...
тоже, кстати можно поискать на форуме , если что...

да, это немного не то
...
Рейтинг: 0 / 0
Интервалы дат
    #39699454
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimets,

варианты из первой ссылки, всё же - то, что доктор прописал...
задача, максимально приближенная к вашей: ссылко

Не обращайте внимания, что там MS SQL. Решение один-в-один на оракле пишется. Просто этот пост весьма нагляден. "С картинками", что называется...
...
Рейтинг: 0 / 0
Интервалы дат
    #39699474
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimets,

с рисунками (можно и в факю добавить)

Объединение временных промежутков

.....
stax
...
Рейтинг: 0 / 0
Интервалы дат
    #39699479
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина АннаDimets,

варианты из первой ссылки, всё же - то, что доктор прописал...
задача, максимально приближенная к вашей: ссылко

Не обращайте внимания, что там MS SQL. Решение один-в-один на оракле пишется. Просто этот пост весьма нагляден. "С картинками", что называется...

Объединение диапазонов дат идущих подряд

.....
stax
...
Рейтинг: 0 / 0
Интервалы дат
    #39699487
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StaxОбъединение диапазонов дат идущих подряд

.....
staxсуть решения не меняется. пересечения отрабатываются также корректно, как и следующие последовательно друг за другом интервалы... более того, там в решении пересечения создаются искусственно, посредством сдвига даты окончания диапазона на один день вперед...
...
Рейтинг: 0 / 0
Интервалы дат
    #39699500
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна,

"идущих подряд" решается намного проще - rownum

.....
stax
...
Рейтинг: 0 / 0
Интервалы дат
    #39699505
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StaxЩукина Анна,

"идущих подряд" решается намного проще - rownum

.....
staxидущих подряд дат - собрать в диапазоны - да,проще через row_number. но суть в том, что там не даты идущие подряд, а диапазоны дат (причем - разновеликие - есть подлиннее, есть покороче). и тут row_number-а уже не хватит...
...
Рейтинг: 0 / 0
Интервалы дат
    #39699512
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна,

конешно не катит, поетому пользуем решение Доброго-Еха

Объединение временных промежутков

.....
stax
...
Рейтинг: 0 / 0
Интервалы дат
    #39699524
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна но суть в том, что там не даты идущие подряд, а диапазоны дат (причем - разновеликие - есть подлиннее, есть покороче). и тут row_number-а уже не хватит...

сдвиг на один день, длина тож вроде одинаковая (19)
если не магия данных, то -rownum хватит

.....
stax
...
Рейтинг: 0 / 0
Интервалы дат
    #39699533
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
переборол лентяйство и набрал тестовые

магия данных
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQL> ed
Wrote file afiedt.buf

  1  with t(d_start,d_stop) as  (
  2  select to_date('22.09.18'),to_date('10.10.18') from dual union all
  3  select to_date('23.09.18'),to_date('11.10.18') from dual union all
  4  select to_date('24.09.18'),to_date('12.10.18') from dual union all
  5  select to_date('25.09.18'),to_date('13.10.18') from dual union all
  6  select to_date('26.09.18'),to_date('14.10.18') from dual union all
  7  select to_date('27.09.18'),to_date('15.10.18') from dual union all
  8  select to_date('23.10.18'),to_date('10.11.18') from dual union all
  9  select to_date('24.10.18'),to_date('11.11.18') from dual
 10  )
 11  , tt as (
 12   select t.*, d_start -row_number() over (order by d_start) gr from t)
 13* select min(d_start),max(d_stop) from tt group by gr
SQL> /

MIN(D_ST MAX(D_ST
-------- --------
22.09.18 15.10.18
23.10.18 11.11.18



....
stax
...
Рейтинг: 0 / 0
Интервалы дат
    #39699561
mibin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

Если добавить вот эту строку, то возникает не работает:
Код: plsql
1.
select to_date('17.10.18', 'dd.mm.yy'), to_date('01.12.18', 'dd.mm.yy') from dual
...
Рейтинг: 0 / 0
Интервалы дат
    #39699563
mibin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

Можно попробовать вот так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
with t(d_start,d_stop) as
  (
    select to_date('22.09.18', 'dd.mm.yy'), to_date('10.10.18', 'dd.mm.yy') from dual union all
    select to_date('23.09.18', 'dd.mm.yy'), to_date('11.10.18', 'dd.mm.yy') from dual union all
    select to_date('24.09.18', 'dd.mm.yy'), to_date('12.10.18', 'dd.mm.yy') from dual union all
    select to_date('25.09.18', 'dd.mm.yy'), to_date('13.10.18', 'dd.mm.yy') from dual union all
    select to_date('26.09.18', 'dd.mm.yy'), to_date('14.10.18', 'dd.mm.yy') from dual union all
    select to_date('27.09.18', 'dd.mm.yy'), to_date('15.10.18', 'dd.mm.yy') from dual union all
    select to_date('23.10.18', 'dd.mm.yy'), to_date('10.11.18', 'dd.mm.yy') from dual union all
    select to_date('24.10.18', 'dd.mm.yy'), to_date('11.11.18', 'dd.mm.yy') from dual union all
    select to_date('17.10.18', 'dd.mm.yy'), to_date('01.12.18', 'dd.mm.yy') from dual union all
    select to_date('17.10.19', 'dd.mm.yy'), to_date('01.12.19', 'dd.mm.yy') from dual
  )
select distinct
       min(t2.d_start) as m_d_start,
       max(t2.d_stop)  as m_d_stop
  from t t1
       inner join t t2
               on t1.d_start <= t2.d_stop
              and t1.d_stop >= t2.d_start
 group by t1.d_start,
          t1.d_stop
...
Рейтинг: 0 / 0
Интервалы дат
    #39699571
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mibinStax,

Если добавить вот эту строку, то возникает не работает:
Код: plsql
1.
select to_date('17.10.18', 'dd.mm.yy'), to_date('01.12.18', 'dd.mm.yy') from dual



Код: plsql
1.
2.
3.
4.
5.
SQL> select to_date('01.12.18', 'dd.mm.yy')-to_date('17.10.18', 'dd.mm.yy') from dual;

TO_DATE('01.12.18','DD.MM.YY')-TO_DATE('17.10.18','DD.MM.YY')
-------------------------------------------------------------
                                                       45.000



сдвиг на один день, длина тож вроде одинаковая (19)

.....
stax
...
Рейтинг: 0 / 0
Интервалы дат
    #39699579
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mibin,

мое решение 21668009 в общем случае неверное (или просто неверное), магия данных
ето скорее схлопнуть последовательность интевальчиков через "один" день одной длины


непрерывные интевалы (схлопнуть) красиво решил Добрый-Ех

.....
stax
...
Рейтинг: 0 / 0
Интервалы дат
    #39699712
Dimets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина АннаDimets,

Как-то так...

Все получилось! Спасибо
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Интервалы дат
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]