sql >> Database >  >> RDS >> Mysql

Een tafel controleren op tijdoverlap?

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;


  1. 7 strategieën om het meeste uit uw vergaderingen te halen

  2. Kan ik een door een PDO voorbereide instructie gebruiken om een ​​identifier (een tabel- of veldnaam) of een syntaxissleutelwoord te binden?

  3. SQLite - Back-up van een database naar bestand

  4. Voorbeelden van MySQL-query's met antwoorden