Найти перекрывающиеся даты в SQL - PullRequest
1 голос
/ 24 января 2011

Каждая регистрация имеет дату начала и окончания. Как найти регистрацию, которая каким-либо образом перекрывает другую.

Спасибо!

Ответы [ 4 ]

2 голосов
/ 24 января 2011

Правильный ответ для теста перекрытия: дважды This.Start против Other.End, как описано здесь http://c2.com/cgi/wiki?TestIfDateRangesOverlap

WHERE A.start < B.end
  AND B.start < A.end

Измените < на <=, если вы считаете, что «трогательные» даты перекрываются, например,

Jan1 - Jan13
Jan13 - Jan15

Возвращает перекрытие для <=, но не перекрытие для <

1 голос
/ 24 января 2011

Это просто проблема SQL ... Я думаю, этот SQL сделает это за вас:

select r1.* 
from registrations r1, registrations r2
where 
  r1.start_date < r2.start_date
  and r1.end_date > r2.start_date

В Rails вы бы сделали это следующим образом:

registrations = Registration.find_by_sql(sql)

Гдеsql равен вышеуказанному коду sql.

0 голосов
/ 25 января 2011

Стандартный SQL имеет оператор OVERLAPS.

CREATE TABLE over_laps
(
  start_date date NOT NULL,
  end_date date NOT NULL,
  CONSTRAINT over_laps_pkey PRIMARY KEY (start_date, end_date),
  CONSTRAINT over_laps_check CHECK (start_date < end_date)
)


insert into over_laps values
('2011-01-10', '2011-01-15'), 
('2011-01-08', '2011-01-09'),
('2011-01-09', '2011-01-10'),
('2011-01-09', '2011-01-11'),
('2011-01-10', '2011-01-12'),
('2011-01-11', '2011-01-13'),
('2011-01-13', '2011-01-15'),
('2011-01-14', '2011-01-16'),
('2011-01-15', '2011-01-17'),
('2011-01-17', '2011-01-19');

select t1.start_date start_1, t1.end_date end_1, 
       t2.start_date start_2, t2.end_date end_2
from over_laps t1
inner join over_laps t2 
  on ((t1.start_date, t1.end_date) overlaps (t2.start_date, t2.end_date))
-- Exclude rows that overlap themselves, a trivial case in a self-joined table.  
where t1.start_date <> t2.start_date and 
      t1.end_date   <> t2.end_date
0 голосов
/ 24 января 2011

Находит любой диапазон 1, у которого любое перекрывается между двумя диапазонами, даже если один не полностью содержится в другом.

select r1.* 
 from registrations r1
 JOIN registrations r2 ON r1.start_date 
                  between r2.start_date
                      AND r2.end_date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...