Dit is een vraagpatroon waarvoor ik het antwoord vele jaren geleden heb gevonden:
SELECT *
FROM mytable a
JOIN mytable b on a.starttime <= b.endtime
and a.endtime >= b.starttime
and a.name != b.name; -- ideally, this would compare a "key" column, eg id
Om "elke overlap" te vinden, vergelijk je het tegenovergestelde einde van het tijdsbestek met elkaar. Het is iets waarvoor ik pen en papier moest pakken en aangrenzende bereiken moest tekenen om te beseffen dat de randgevallen op deze vergelijking neerkwamen.
Als u wilt voorkomen dat rijen elkaar overlappen, plaatst u een variant van deze zoekopdracht in een trigger:
create trigger mytable_no_overlap
before insert on mytable
for each row
begin
if exists (select * from mytable
where starttime <= new.endtime
and endtime >= new.starttime) then
signal sqlstate '45000' SET MESSAGE_TEXT = 'Overlaps with existing data';
end if;
end;