如何在SQL查询中查找时隙冲突

如何在SQL查询中查找时隙冲突,sql,sql-server,sql-server-2008,between,Sql,Sql Server,Sql Server 2008,Between,我想找出时间冲突,但它没有给我以下记录的正确结果。 我想为时隙“t1.starttime到t2.endtime”返回conflict true,因为这个时隙与“t2.starttime和t2.endtime”冲突,因为7到12个时间段覆盖了8到11.30的一些时间 t1.StartTime t1.EndTime t2.StartTime t2.EndTime ---------------- ---------------- ---------------- ----

我想找出时间冲突,但它没有给我以下记录的正确结果。 我想为时隙“t1.starttime到t2.endtime”返回conflict true,因为这个时隙与“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) < CAST(t2.EndTime as TIME) and
        CAST(t1.EndTime as TIME) > CAST(t2.StartTime as TIME);
选择计数(1)
从t1内部连接
t2
开始时(t1.开始时间为时间)<结束时(t2.结束时间为时间)和
CAST(t1.结束时间为时间)>CAST(t2.开始时间为时间);

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

您是否搜索过:[tsql]或[sql server]或[sql-server-2008]或[sql-server-2008-r2]或[sql-server-2005]重叠范围如果您实际尝试按照自己的查询,您会注意到7不在8到11:30之间,12也不在8到11:30之间。当然你的条件不符合。有关正确的逻辑,请参见Gordon的答案。通常帮助你的是,拿一张纸,试着画出你的问题,时间段是线重叠的。画出所有可能的重叠,看看在每种情况下,你能在每行的开始和结束之间找到什么逻辑关系。你可能应该阅读这篇文章。+1当然是为了逻辑,但也为了不将连接条件的优雅用法更改为
,其中
,就像OP前面的问题:)
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);