Запрос на расхождение временных интервалов

Molodb
Дата: 25.09.2015 13:56:43
Здравствуйте, коллеги! Требуется альтернативное- более рациональное решение задачи на сходимость временных интервалов!
В приложении картинка, изображающая текущую картинку в базе. Есть две одинаковые по структуре таблицы с разными данными (id, value_1, start_date, end_date) и (id, value_1, start_date, end_date)
Необходимо сджойнить записи в этих таблицах по ID,но необходимы не все записи, а лишь те что приходятся имеют пересечения по временным интервалам (на картинке обозначено красным).
Я создал следующий запрос:
select
t1.id,
t1.value,
t2.id,
t2.value
from t1 JOIN t2
WHERE
(to_date(to_char(t2.start_date, 'DD.MM.YY')) BETWEEN to_date(to_char(t1.start_date, 'DD.MM.YY')) AND to_date(to_char(t1.end_date, 'DD.MM.YY'))
OR to_date(to_char(t2.end_date, 'DD.MM.YY')) BETWEEN to_date(to_char(t1.start_date, 'DD.MM.YY')) AND to_date(to_char(t1.end_date, 'DD.MM.YY'))
)
OR  
 (to_date(to_char(t1.start_date, 'DD.MM.YY')) BETWEEN to_date(to_char(t2.start_date, 'DD.MM.YY')) AND to_date(to_char(t2.end_date, 'DD.MM.YY'))
OR to_date(to_char(t1.end_date, 'DD.MM.YY')) BETWEEN to_date(to_char(t2.start_date, 'DD.MM.YY')) AND to_date(to_char(t2.end_date, 'DD.MM.YY'))
)


Начальник говорит,что условие для where, которое я сделал нерациональное. Подскажите как оптимизировать запрос.
Большое спасибо!
Elic
Дата: 25.09.2015 14:04:21
Molodb
to_date(to_char(..., 'DD.MM.YY'))
что условие для where, которое я сделал нерациональное
Во-первых, говнокодищее.
Во-вторых, пересекаемость - это когда взаимно начало одного раньше конца второго.
Molodb
Дата: 25.09.2015 14:06:36
to_date(to_char.. нужен для того чтобы секунды не учитывались
JDS
Дата: 25.09.2015 14:09:46
Molodb
to_date(to_char.. нужен для того чтобы секунды не учитывались

Может тогда to_char(..., 'yyyymmdd')? )
JDS
Дата: 25.09.2015 14:10:56
Molodb
to_date(to_char.. нужен для того чтобы секунды не учитывались

Или trunk(t2.start_date, 'dd')? )
Molodb
Дата: 25.09.2015 14:12:32
JDS,

Ну да, спасибо, эту часть запроса сделали лучше)
JDS
Дата: 25.09.2015 14:14:05
Ну и кто в курсе
from t1 JOIN t2
WHERE

нормально ли так писать (без указания условий в ON для join, а писать их сразу в where), хотя оракле-то поймет небось )
ArtNick
Дата: 25.09.2015 14:15:02
JDS
Molodb
to_date(to_char.. нужен для того чтобы секунды не учитывались

Может тогда to_char(..., 'yyyymmdd')? )

А разве это решение отличается от предложенного автором?
Molodb
Дата: 25.09.2015 14:15:49
:D Ну конечно там должно быть ON, просто код примерно переписывал под воображаемые таблицы t1,t2
JDS
Дата: 25.09.2015 14:20:00
ArtNick
А разве это решение отличается от предложенного автором?

Нет конечно, можно попробовать так )
SELECT t1.id, t1.value, t2.id, t2.value
  FROM t1, t2
 WHERE TRUNC(t1.start_date, 'dd') <= TRUNC(t2.end_date, 'dd')
   AND TRUNC(t1.end_date, 'dd') >= TRUNC(t2.start_date, 'dd')

Ну и с индексами надо смотреть или искать более правильные варианты )