НАЙТИ ЗАПИСИ, КОТОРЫЕ ДАТЫ ПЕРЕКРЫВАЮТСЯ С ДРУГИМИ - PullRequest
0 голосов
/ 09 мая 2019

Как я могу найти записи, чей диапазон дат перекрывается.Пожалуйста, посмотрите на следующую картинку.enter image description here

select memid, enrid, memfirstname, memlastname,
       gender, dob, relflag, udfc5, effdate,
       termdate, lvlid5, lvldesc5, lvlid6, lvldesc6
  from zzz_temp
  where memid = '012345'
  order by effdate, termdate;

Я выбрал одного члена (SUJAN SHRESTHA) из таблицы ZZZ_TEMP в качестве примера.В этой таблице более миллиона членов.Я хочу найти такие записи, чей диапазон дат перекрывается внутри члена.На приведенном выше рисунке effdate и termdate обозначают даты начала и окончания соответственно.Записи 1 и 2 имеют одинаковую дату и дату, которые пересекаются с записями 3 и 4 на 1 месяц 20 дней.Мне нужно найти только эти первые четыре записи.Все остальные записи будут исключены, поскольку effdate больше, чем termdate.

запрос, который я пробовал.

select t1.*
  from zzz_temp t1
  join t zzz_temp t2 
    on (t1.effdate  > t2.effdate  and t1.effdate  < t2.termdate) or 
       (t1.termdate > t2.effdate  and t1.termdate < t2.termdate) or 
       (t1.termdate > t2.termdate and t1.effdate  < t2.effdate);

Но это не сработало.Может кто-нибудь помочь мне понять это.

1 Ответ

1 голос
/ 09 мая 2019

Чтобы проверить совпадения, вы проверяете, что end_date таблицы 2 больше, чем start_date таблицы 1, а start_date таблицы 2 меньше даты окончания таблицы 2.Это сделало бы ваш запрос следующим образом:

select *
from   zzz_temp t1
       inner join zzz_temp t2 
         on t1.memid = t2.memid
            and t2.end_date > t1.start_date
            and t2.start_date < t1.end_date;

Вы можете или не хотите преобразовывать одно или оба из этих неравенств, чтобы включить равенство (например, t2.end_date <= t1.start_date) в зависимости от того, что для вас считается перекрытием.

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