Mysql
 sql >> Base de données >  >> RDS >> Mysql

Vérifier un tableau pour le chevauchement de temps ?

Voici un modèle de requête pour lequel j'ai trouvé la réponse il y a de nombreuses années :

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

Pour trouver "tout chevauchement", vous comparez l'opposé extrémités de la période les unes avec les autres. C'est quelque chose pour lequel j'ai dû sortir un stylo et du papier et dessiner des plages adjacentes pour réaliser que les cas extrêmes se résumaient à cette comparaison.

Si vous souhaitez éviter que des lignes ne se chevauchent, placez une variante de cette requête dans un déclencheur :

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;