這是一個經典的時間重疊問題。假設你想在A(start_date)期間註冊某個團隊直到B(end_date)。
這不應當在下一情況下,被允許:
- 同一團隊已被註冊,從而爲註冊週期是完全的AB時期內(起始> = A日期和結束日期< = B)
- 同一團隊已經被登記在A點(起始< = A日期和結束日期> = A)
- 同一團隊已經被登記在B點(起始< = B日期和結束日期> = B)
在這些情況下,註冊會導致時間重疊。在任何其他它不會,所以你可以自由註冊。
在SQL中,檢查將是:
select count(*) from ejl_team_registration
where (team_id=123 and league_id=45)
and ((start_date>=A and end_date<=B)
or (start_date<=A and end_date>=A)
or (start_date<=B and end_date>=B)
);
...當然與實際值的對TEAM_ID,league_id,A和B.
如果查詢返回什麼比0一樣,該團隊已經註冊並且再次註冊會導致時間重疊。
爲了證明這一點,讓我們填充表:
insert into ejl_team_registration (id, team_id, league_id, start_date, end_date)
values (1, 123, 45, '2007-01-01', '2007-12-31')
, (2, 123, 45, '2008-01-01', '2008-12-31')
, (3, 123, 45, '20010-01-01', '2010-12-31');
讓我們來看看,如果我們能在 '2009-02-03' 之間leage 45註冊團隊123和 '2009-12-31':
select count(*) from ejl_team_registration
where (team_id=123 and league_id=45)
and ((start_date<='2009-02-03' and end_date>='2009-12-31')
or (start_date<='2009-03-31' and end_date>='2009-03-02')
or (start_date<='2009-12-31' and end_date>='2009-12-31')
);
結果爲0,所以我們可以自由註冊。 在例如'2009-02-03'和'2011-12-31'是不可能的。 我會留下檢查其他值作爲練習。 PS:你提到結束日期通常不是問題。事實上,事實上,由於插入具有無效結束日期的條目也會導致重疊。
「start_date不應該在現有記錄的開始和結束日期之間」。在你的例子中,start_date不在現有的開始和結束日期之間 – nickf 2009-02-02 14:05:45