如何检查时间跨度是否与其他时间跨度重叠

时间:2013-12-20 17:16:44

标签: mysql sql time

我遇到的问题是如何检查时间跨度是否与数据库中的其他时间跨度重叠。

例如,我的表格如下:

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时,它应该返回两行。

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

3 个答案:

答案 0 :(得分:5)

当检查时间跨度重叠时,您只需要这样的查询(将@Start和@End替换为您的值):

对于非重叠

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

因此,逆转逻辑,重叠

SELECT *
FROM tbl
WHERE @End >= tbl.start AND @Start <= tbl.end

答案 1 :(得分:0)

假设您的时间跨度由两个值表示 - lower_boundupper_bound,请确保它们都位于开头和结尾之间:

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

答案 2 :(得分:0)

这是SQL小提琴http://sqlfiddle.com/#!2/e4aee/37

你也可以使用BETWEEN运算符,相比之下,这应该比在WHERE子句中使用三个逻辑表达式更快

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'