powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вывод пересечений между датами
4 сообщений из 4, страница 1 из 1
Вывод пересечений между датами
    #39691919
svanrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Друзья, выручайте.

create table t as
select 'A' FIO,to_date('01.08.2018','dd.mm.yyyy') startdate, to_date('02.08.2018','dd.mm.yyyy') enddate from dual union all
select 'B',to_date('03.08.2018','dd.mm.yyyy'), to_date('04.08.2018','dd.mm.yyyy') from dual union all
select 'C',to_date('05.08.2018','dd.mm.yyyy'), to_date('12.08.2018','dd.mm.yyyy') from dual union all
select 'D',to_date('12.08.2018','dd.mm.yyyy'), to_date('16.08.2018','dd.mm.yyyy') from dual union all
select 'D',to_date('17.08.2018','dd.mm.yyyy'), to_date('22.08.2018','dd.mm.yyyy') from dual union all
select 'D',to_date('18.08.2018','dd.mm.yyyy'), to_date('20.08.2018','dd.mm.yyyy') from dual union all
select 'D',to_date('19.08.2018','dd.mm.yyyy'), to_date('22.08.2018','dd.mm.yyyy') from dual union all
select 'D',to_date('17.08.2018','dd.mm.yyyy'), to_date('23.08.2018','dd.mm.yyyy') from dual
;

create or replace function f return sys.odcivarchar2list as
dt date := to_date('01.01.1901','dd.mm.yyyy');
result sys.odcivarchar2list := sys.odcivarchar2list();
begin
for i in (select rowid, t.* from t)
loop
if i.startdate > dt then
dt := i.enddate;
result.extend;
result(result.count) := rowidtochar(i.rowid);
end if;
end loop;
return result;
end;

select *
from t
where rowid in (select chartorowid(column_value) from table(f));

Нужно, чтобы выводило все пересечения по датам с фио D.
Т.е. запросы выдавал строки с ФИО т.к. каждая из дат попадает в уже имеющиеся диапазоны у данного фио.

Пожалуйста, подскажите, что поправить ?
...
Рейтинг: 0 / 0
Вывод пересечений между датами
    #39691954
Popipo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно использовать данный запрос
Код: plsql
1.
2.
3.
4.
select * from t t1 where exists( select 1 from t t2 
  where t1.startdate < t2.enddate and t2.enddate > t1.startdate 
  and t1.fio = t2.fio 
  and t1.startdate != t2.startdate and t2.enddate != t1.enddate);



Конечно тут есть изъян, что если будут 2 одинаковых отрезка, для одного fio, то он их не выдаст, но это решается добавлением поля id и переделыванием запроса
Код: plsql
1.
2.
3.
4.
select * from t t1 where exists( select 1 from t t2 
  where t1.startdate < t2.enddate and t2.enddate > t1.startdate 
  and t1.fio = t2.fio and t1.id != t2.id 
  and t1.startdate != t2.startdate and t2.enddate != t1.enddate);
...
Рейтинг: 0 / 0
Вывод пересечений между датами
    #39691958
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну же, кто помнит про секретный недокументированный оператор типа пересечения дат
Или здесь не об этом?
...
Рейтинг: 0 / 0
Вывод пересечений между датами
    #39691965
Popipo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не знал что такое есть в оракле
Код: plsql
1.
  where wm_overlaps(wm_period(t1.startdate, t1.enddate), wm_period(t2.startdate, t2.enddate)) = 1


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


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