【问题标题】: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 之间的值
  • 请记住表格有名称,并在问题中引用名称。

标签: mysql sql time


【解决方案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'
    

    【讨论】:

      猜你喜欢
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 2021-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多