如何检查时间跨度是不是与其他时间跨度重叠[重复]

Posted

技术标签:

【中文标题】如何检查时间跨度是不是与其他时间跨度重叠[重复]【英文标题】:How to check if a time span overlaps other time spans [duplicate]如何检查时间跨度是否与其他时间跨度重叠[重复] 【发布时间】:2014-01-09 14:49:52 【问题描述】:

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

例如,我的表是这样的:

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

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

【问题讨论】:

不必在问题的主题中加入标签信息(如“(SQL)”);这就是我们有标签的原因。 :-) 您可以使用 EXPR1 和 EXPR2 之间的值 请记住表格有名称,并在问题中引用名称。 【参考方案1】:

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

对于非重叠

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

因此,反转逻辑,重叠

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

@KenWhite 此查询检查[:lower_boud, :upper_bound] 是否包含在[start, end] 中,这是我对OP 要求的理解。如果要求是相反的,那么是的,确实,符号应该颠倒过来。 我认为你可能是对的,在重新阅读这个问题之后。它的措辞不是很清楚。 :-)【参考方案3】:

这里是 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'

【讨论】:

以上是关于如何检查时间跨度是不是与其他时间跨度重叠[重复]的主要内容,如果未能解决你的问题,请参考以下文章

与图像的重叠跨度

更改时间跨度毫秒分隔符;逗号(,)代替点(。)[重复]

以不同的时间跨度分组

更改跨度文本? [复制]

如何在CSS中将跨度文本居中在图像旁边[重复]

岛屿和间隙的 SQL:岛屿可以重叠