Каждая регистрация имеет start_date и end_date. Как я могу найти регистрацию, которая каким-либо образом перекрывает другую.Найти совпадающие даты в SQL
Спасибо!
Каждая регистрация имеет start_date и end_date. Как я могу найти регистрацию, которая каким-либо образом перекрывает другую.Найти совпадающие даты в SQL
Спасибо!
Это просто проблема 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-код выше.
Правильный ответ для испытания перекрытия дважды 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 любого перекрытия между двумя диапазонами, даже если не полностью содержится в других.
select r1.*
from registrations r1
JOIN registrations r2 ON r1.start_date
between r2.start_date
AND r2.end_date
В стандартном 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
Похоже, что он найдет только, когда r2 полностью содержится в r1, я думаю, что вопрос заключался в том, чтобы найти любое перекрытие. –