Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Eine Tabelle auf Zeitüberschneidung prüfen?

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;