2011-01-24 4 views

ответ

1

Это просто проблема 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

Похоже, что он найдет только, когда r2 полностью содержится в r1, я думаю, что вопрос заключался в том, чтобы найти любое перекрытие. –

2

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

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

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

Jan1 - Jan13 
Jan13 - Jan15 

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

0

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

select r1.* 
from registrations r1 
JOIN registrations r2 ON r1.start_date 
        between r2.start_date 
         AND r2.end_date 
0

В стандартном 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 
Смежные вопросы