我有一个包含以下字段的 MySQL 表:
- 姓名
- 开始时间
- 结束时间
starttime
和 endtime
是 MySQL TIME
字段(不是 DATETIME
)。我需要一种方法来定期“扫描”表以查看表内的时间范围是否有重叠。如果 10:00-11:00
有一个事件,10:30-11:30
有另一个事件,我希望收到有关时间重叠存在的提醒.
没什么特别的,我只是想知道是否存在重叠。
我将使用 PHP 来执行此操作。
最佳答案
这是一个查询模式,我多年前就找到了答案:
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
要找到“任何重叠”,您可以将时间范围的相反两端进行比较。我必须拿出笔和纸并绘制相邻范围才能意识到边缘情况归结为这种比较。
<小时/>如果您想防止任何行重叠,请将此查询的变体放入触发器中:
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;
关于mysql - 检查表的时间重叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55663922/