在SQL Server中查找冲突记录

在SQL Server中查找冲突记录,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个SQL Server表 Meetings: -Id, -RoomId, -DataFrom, -DataTo 我想参加所有有冲突的会议。 有一个例子: Meeting 1: Id: 1, RoomId: 1, DataFrom: 1 P.M DataTo: 3 P.M Meeting 2: Id: 2 Room: 1, DataFrom: 2.P.M DataTo: 3 P.M 因为房间是相同的,第二次会议设置在第一次会议期间,所以会发生冲突 我还需要指向冲突对象的Id。 如何做到

我有一个SQL Server表

Meetings:
-Id,
-RoomId,
-DataFrom,
-DataTo
我想参加所有有冲突的会议。 有一个例子:

Meeting 1:
Id: 1,
RoomId: 1,
DataFrom: 1 P.M
DataTo: 3 P.M

Meeting 2:
Id: 2
Room: 1,
DataFrom: 2.P.M
DataTo: 3 P.M
因为房间是相同的,第二次会议设置在第一次会议期间,所以会发生冲突

我还需要指向冲突对象的Id。 如何做到这一点,按视图还是按功能

WITH MEETINGS(ID,ROOMID,DATAFROM,DATATO) AS
(
   SELECT 1,1,'20210421 13:00','20210421 15:00'
     UNION ALL
  SELECT 2,1,'20210421 14:00','20210421 15:00'
)
SELECT M.ID ,M.ROOMID,M.DATAFROM,M.DATATO,M2.ID AS CONFLICTED_ID
FROM MEETINGS  AS M
JOIN MEETINGS AS M2 ON M.ROOMID=M2.ROOMID
AND (M.DATAFROM BETWEEN M2.DATAFROM AND M2.DATATO OR
    M.DATATO BETWEEN M2.DATAFROM AND M2.DATATO)
AND M.ID<>M2.ID

你能试试上面的吗?我们有两个句点p1和p2,如果p1.start在p2.start和p2.end之间,或者p2.start在p1.start和p1.end之间,这两个句点会相互冲突。我建议在纸上画两条线作为一个句点,并模拟我所解释的内容

注意:有一点很棘手,我们不能使用between语法,因为如果我们有两个会议,一个从1开始到3,另一个从3开始到5,在同一个房间里,这两个会议并不冲突,但between会将其视为冲突,所以我们必须使用来完成这项工作

SELECT M1.ID, M2.ID
FROM MEETINGS M1
CROSS JOIN MEETINGS M2
WHERE M1.ID != M2.ID 
AND M1.DATAFROM > M2.DATAFROM 
AND M1.DATAFROM < M2.DATATO
ORDER BY M1.ID

如果一次会议在第二次会议之前开始,而第一次会议在第一次会议之后结束,则两次会议重叠

要获取所有重叠的会议,可以使用exists:


是DataFrom和DataTo datetime字段吗?根据问题指南,请说明您尝试了什么,并告诉我们您在本网站或其他网站上找到了什么,以及为什么它不满足您的需要。我注意到您尚未接受您之前9个问题的答案-有什么原因吗?我认为这是不正确的!如果一个会议从1点开始到3点,那么另一个会议从3点开始到5点,在同一个房间里,你的提问会认为这是冲突,对吗?我想是的。使用>=和<的解决方案看起来更好
SELECT M1.ID, M2.ID
FROM MEETINGS M1
CROSS JOIN MEETINGS M2
WHERE M1.ID != M2.ID 
AND M1.DATAFROM > M2.DATAFROM 
AND M1.DATAFROM < M2.DATATO
ORDER BY M1.ID
select m.*
from meetings m
where exists (select 1
              from meetings m2
              where m2.roomid = m.roomid and
                    m2.datafrom < m.datato and
                    m2.datato > m.datafrom
             )
order by roomid, datafrom;
select m.*, m2.*
from meetings m join
     meetings m2
     on m2.roomid = m.roomid and
        m2.datafrom < m.datato and
        m2.datato > m.datafrom
order by m.roomid, m.datafrom;
A---B-----B---A