sql >> Database teknologi >  >> RDS >> Mysql

Kontrollerer du en tabel for tidsoverlapning?

Dette er et forespørgselsmønster, som jeg fandt svaret på for mange år siden:

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

For at finde "enhver overlapning", sammenligner du det modsatte ender af tidsrammen med hinanden. Det er noget, jeg var nødt til at få en pen og papir ud for og tegne tilstødende intervaller for at indse, at kantkasserne kogte ned til denne sammenligning.

Hvis du vil forhindre nogen rækker i at overlappe, skal du sætte en variant af denne forespørgsel i en 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. Hvordan opretter jeg forbindelse til en SQL Server 2008-database ved hjælp af JDBC?

  2. PostgreSQL - max antal parametre i IN-klausul?

  3. syntaks for enkelt række MERGE / upsert i SQL Server

  4. Få advarsel:Nulværdi elimineres af en samlet eller anden SET-operation