2011-01-24 7 views
1

各登録はstart_dateとend_dateを持ちます。どのようにして他のものと重複する登録を見つけることができますか?SQLで重複する日付を検索

ありがとうございます!

答えて

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では、あなたがこのような行いたい:

SQLに等しい
registrations = Registration.find_by_sql(sql) 

を上記のsqlコード。

+0

これは、r2がr1に完全に含まれている場合にのみ表示されるように見えますが、問題は重複を見つけることだったと思います。 –

2

あなたは重複として「感動」の日付を考える場合には、例えば、ここに<=からhttp://c2.com/cgi/wiki?TestIfDateRangesOverlap

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

変更<を説明するように、オーバーラップテストの正解は、二回This.StartOther.End対です

Jan1 - Jan13 
Jan13 - Jan15 

戻り<=ため重ならなくオーバーラップ<

0

ためこれは、1つは完全に他のに含まれていない場合であっても、二つの範囲の間任意重なりを有している任意の範囲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