【问题标题】:How to find timeslot conflict in SQL query如何在 SQL 查询中查找时隙冲突
【发布时间】:2014-01-10 14:53:22
【问题描述】:

我想找到时间冲突,但它没有给我以下记录的正确结果。 我想为时间段返回冲突真值 - “t1.starttime 到 t2.endtime”,因为这个时间段与“t2.starttime 和 t2.endtime”冲突,因为 7 到 12 时间覆盖了 8 到 11.30 的某个时间。

t1.StartTime t1.EndTime t2.StartTime t2.EndTime
---------------------------------------------------- --------------
07:00:00.0000000 12:00:00.0000000 08:00:00.0000000 11:30:00.0000000

我执行下面的查询,但它没有给我结果。

SELECT 
  count(1) 
FROM 
  t1 INNER JOIN t2 ON

  CAST(t1.StartTime as TIME)  
  BETWEEN CAST(t2.StartTime as TIME) 
  AND CAST(t2.EndTime as TIME) OR CAST(t1.EndTime as TIME)  
  BETWEEN CAST(t2.StartTime as TIME) 
  AND CAST(t2.EndTime as TIME)

【问题讨论】:

  • 你是否搜索过:[tsql] or [sql-server] or [sql-server-2008] or [sql-server-2008-r2] or [sql-server-2005] 重叠范围
  • 如果您真的尝试按照自己的查询进行查询,您会注意到 7 不在 8 到 11:30 之间,而 12 也不是。所以当然不满足你的条件。有关正确逻辑,请参阅 Gordon 的答案。通常有帮助的是实际拿一张纸并尝试将您的问题绘制为线条重叠的时间段。画出所有可能的重叠部分,看看在每种情况下,您可以在每行的开头和结尾之间找到什么逻辑关系。
  • 您可能应该阅读此article

标签: sql sql-server sql-server-2008 between


【解决方案1】:

重叠的正确逻辑要简单一些:

SELECT count(1) 
FROM t1 INNER JOIN
     t2
     ON CAST(t1.StartTime as TIME) < CAST(t2.EndTime as TIME) and
        CAST(t1.EndTime as TIME) > CAST(t2.StartTime as TIME);

逻辑是一个区间在另一个结束之前开始,在另一个区间开始之后结束。

【讨论】:

  • +1 用于逻辑当然,但也用于不将连接条件的优雅使用更改为where 就像在 OP 的早期问题中发生的那样:)
猜你喜欢
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多