这是一个经典的时间重叠问题。假设你想在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