Đây là mẫu truy vấn mà tôi đã tìm thấy câu trả lời nhiều năm trước:
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
Để tìm "bất kỳ sự chồng chéo nào", bạn so sánh đối diện kết thúc của khung thời gian với nhau. Đó là thứ mà tôi đã phải lấy giấy bút ra và vẽ các phạm vi liền kề để nhận ra rằng các trường hợp cạnh đã thu hút sự so sánh này.
Nếu bạn muốn ngăn bất kỳ hàng nào chồng chéo lên nhau, hãy đặt một biến thể của truy vấn này trong trình kích hoạt:
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;