В стандартном SQL это можно сделать с помощью коррелированного подзапроса:
select
t.id,
case
when exists (
select 1
from mytable t1
where
t1.id <> t.id
and t1.start_date <= t.end_date
and t1.end_date >= t.start_date
)
then 'true'
else 'false'
end overlap
from mytable t
Коррелированный подзапрос, введенный условием exists
, проверяет, имеет ли другая запись диапазон дат, перекрывающий текущую запись. ; некоторые базы данных имеют встроенные функции для этого (а именно, Postgres имеет оператор overlaps
).
Некоторые базы данных также поддерживают прямую оценку условий как логических (или 0/1
чисел): в этом случае вам не нужно выражение case
, вы можете непосредственно поместить условие exists
в список select
.
Редактировать : в Postgres, что было наконец помеченный, запрос становится проще:
select
t.id,
exists (
select 1
from mytable t1
where
t1.id <> t.id
and (t1.start_date, t1.end_date) overlaps (t.start_date, t.end_date)
) overlap
from mytable t
SQLFiddle