mysql - 检查表的时间重叠?

标签 mysql sql time range overlap

我有一个包含以下字段的 MySQL 表:

  • 姓名
  • 开始时间
  • 结束时间

starttimeendtime 是 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/

相关文章:

ruby-on-rails - DateTime 类的意义何在?

甲骨文10gr2 : enforce dates entered are between 9am and 5pm?

java - JDBC mysql meta.getExportedKeys() 返回空结果集

php - 2 不是有效的 MySQL-Link 资源。怎么修?相同的脚本在另一台服务器上工作(不是配音,因为它在其他服务器上工作)

mysql - 正确的 MySQL 方法将一个表的列添加到另一个表

mysql - 按结果中的计数排序

php - 从Mysql中选择最新记录时出现问题

SQLSTATE[22P02] : Invalid text representation

c# - 我可以使用 Sql Server Express 复制和使用 mdf 文件吗?

python - python的time.sleep()有多准确?