이것은 시간이 겹치는 고전적인 문제입니다. B (end_date)까지 A (start_date)의 기간 동안 특정 팀을 등록하려고한다고 가정 해보십시오.
이러한 경우 등록을하면 시간이 겹치게됩니다. 다른 어떤 경우에는 그렇게하지 않으므로 등록 할 수 있습니다. 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-12-31'을 '2009-02-03'사이 leage 45 팀 (123)을 등록하고 수 있는지의 확인하자 :
이를 증명하기 위해, 테이블을 채울 수 있도록
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'은 불가능합니다. 연습용으로 다른 값을 확인해 드리겠습니다.
추신 : 끝 날짜는 일반적으로 문제가되지 않는다고 말씀하셨습니다. 유효하지 않은 종료 날짜가있는 항목을 삽입하면 중복되기 때문에 사실입니다.
"start_date는 기존 레코드의 시작 날짜와 종료 날짜 사이에 있어서는 안됩니다."당신의 예제에서 start_date는 기존 시작과 끝 날짜 사이에 있지 않습니다 – nickf