Ini adalah pola kueri yang saya temukan jawabannya bertahun-tahun yang lalu:
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
Untuk menemukan "setiap tumpang tindih", Anda membandingkan berlawanan ujung jangka waktu satu sama lain. Itu adalah sesuatu yang saya harus mengeluarkan pena dan kertas dan menggambar rentang yang berdekatan untuk menyadari bahwa kasus tepi bermuara pada perbandingan ini.
Jika Anda ingin mencegah baris agar tidak tumpang tindih, tempatkan varian kueri ini di pemicu:
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;