Dies ist ein Abfragemuster, für das ich vor vielen Jahren die Antwort gefunden habe:
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
Um "irgendeine Überschneidung" zu finden, vergleichen Sie das Gegenteil Enden des Zeitraums miteinander. Dafür musste ich Papier und Stift holen und benachbarte Bereiche zeichnen, um zu erkennen, dass die Grenzfälle auf diesen Vergleich hinausliefen.
Wenn Sie verhindern möchten, dass sich Zeilen überschneiden, fügen Sie eine Variante dieser Abfrage in einen Trigger ein:
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;