Det här är ett frågemönster som jag hittade svaret på för många år sedan:
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
För att hitta "någon överlappning" jämför du motsatsen slutar på tidsramen med varandra. Det är något jag var tvungen att ta fram en penna och papper för och rita intilliggande intervall för att inse att kantfodralen kokade ner till den här jämförelsen.
Om du vill förhindra att några rader överlappar, placera en variant av denna fråga i en utlösare:
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;