Это классическая проблема перекрытия времени. Допустим, вы хотите зарегистрировать определенную команду на период от A (дата_ начала) до B (дата_ конца).
Это НЕ должно быть разрешено в следующих случаях:
- та же команда уже зарегистрирована, так что зарегистрированный период полностью находится внутри периода A-B (start_date> = A и end_date <= B) </li>
- та же команда уже зарегистрирована в точке A (start_date <= A и end_date> = A)
- та же команда уже зарегистрирована в точке B (start_date <= B и end_date> = 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');
Давайте проверим, можем ли мы зарегистрировать команду 123 на этапе 45 между '2009-02-03' и '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: Вы упоминали, что дата окончания обычно не является проблемой. На самом деле это так, поскольку вставка записи с недопустимой датой окончания также может привести к перекрытию.