我遇到的问题是如何检查时间跨度是否与数据库中的其他时间跨度重叠。
例如,我的表格如下:
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
时,它应该返回两行。
我很难解释,但我希望有人能够理解我足以帮助我。
答案 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_bound
和upper_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'