sql >> Databasteknik >  >> RDS >> Mysql

Kontrollera en tabell för tidsöverlappning?

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;


  1. Hur man får sista posten i varje grupp i MySQL

  2. Standardradordning i SELECT-fråga - SQL Server 2008 vs SQL 2012

  3. VARCHAR och NVARCHAR datatyper i SQL Server

  4. Django modellerar en främmande nyckel till många tabeller