关于mysql:如何检查时间跨度是否与其他时间跨度重叠

How to check if a time span overlaps other time spans

本问题已经有最佳答案,请猛点这里访问。

我一直在问如何检查一个时间跨度是否与数据库中的其他时间跨度重叠。

例如,我的表如下所示:

1
2
3
id start    end
1  11:00:00 13:00:00
2  14:30:00 16:00:00

现在,我尝试进行一个查询,检查时间跨度是否与其中一个时间跨度重叠(并且它应该返回任何重叠的时间跨度)。

  • 当我尝试14:00:00 - 15:00:00时,它应该返回第二行。

  • 当我尝试13:30:00 - 14:15:00时,它不应该返回任何东西。

  • 当我尝试10:00:00 - 15:00:00时,它应该返回两行。

我很难解释,但我希望有人能理解我,帮助我。


当检查时间跨度重叠时,您只需要这样一个查询(用您的值替换@start和@end):

对于非重叠

1
2
3
SELECT *
FROM tbl
WHERE @End < tbl.start OR @Start > tbl.end

因此,颠倒逻辑,对于重叠

2


这是SQL小提琴http://sqlpiddle.com/!2/E4AEE/37

也可以使用between运算符,相对而言,这应该比在where子句中使用三个逻辑表达式更快。

1
2
3
4
5
6
7
SELECT *
FROM
(
  SELECT CONCAT(CAST(HOUR(TD) AS CHAR(2)), ':', CAST(MINUTE(TD) AS CHAR(2)), ':', CAST(SECOND(TD) AS CHAR(2)))  AS DT1
  FROM DUMMY
) A
WHERE DT1 BETWEEN '14:03:02' AND '18:01:01'


假设您的时间跨度由两个值表示——lower_boundupper_bound,请确保它们都在开始和结束之间:

1
2
3
SELECT *
FROM   my_table
WHERE  start <= :lower_bound AND end >= :upper_bound