SQL 查询以检查范围

SQL Query to check Range

我正在尝试编写一个 SQL 查询,该查询基本上采用已为特定日期插入的起始值和结束值,并将它们与所有起始值和结束值进行比较,以输出未插入的所有内容'冲突。换句话说,我正在编写一个日程安排应用程序,它应该告诉一个人由于日程安排冲突他们不能参加的课程。这就是我现在拥有的:

    SELECT C2.COURSENUM, C2.SECTIONID
    FROM TIMES T2, CLASSES C2
    WHERE T2.SECTIONID = C2.SECTIONID AND 
    (T2.MONSTART >= 
        (SELECT T.MONEND
        FROM DEGAUDIT D, UNDERGRAD S, TIMES T, CLASSES C
        WHERE D.SID = S.SID AND S.SSN = ? AND C.SECTIONID = T.SECTIONID 
        AND D.SECTIONID = C.SECTIONID)

        OR T2.MONEND <= 

            (SELECT T.MONSTART
            FROM DEGAUDIT D, UNDERGRAD S, TIMES T, CLASSES C
            WHERE D.SID = S.SID AND S.SSN = ? AND 
            C.SECTIONID = T.SECTIONID 
            AND D.SECTIONID = C.SECTIONID))

其中 MonStart 和 MonEnd 分别是我的开始时间和结束时间。现在,我遇到了麻烦,因为两个子查询 return 不止一个值,您不能将其与 <= 符号或 >= 符号一起使用。有没有办法使用 IN 或 NOT IN 来完成此任务?谢谢!非常感谢您的帮助。

这是您问题的简化版本,仅显示一个 table 'times' 来说明这个想法。

我的建议是您将逻辑倒过来,将当前时隙与所有其他时隙进行比较,看看是否有 重叠。如果有,则排除当前时隙。所以它看起来像这样:-

CREATE TABLE times
(
TimeID int,
StartTime Time,
EndTime Time
)

INSERT INTO times
VALUES
(1,'10:00:00','12:00:00'),
(2,'10:00:00','12:00:00'),
(3,'14:00:00','16:00:00'),
(4,'14:00:00','16:00:00'),
(5,'12:00:00','13:00:00'),
(6,'13:00:00','14:00:00')

SELECT  *
FROM times tim

WHERE not exists

(
    SELECT
    TimeID FROM
    times tom
    WHERE
    tom.EndTime>tim.StartTime
    AND
    tom.StartTime<tim.EndTime
    AND
    tom.TimeID<>tim.TimeID
)

只有最后两个时隙不与任何其他时隙重叠。

cf this answer,但你想要 < 和 > 而不是 <= 和 >=,因为你不介意范围是否接触,只要学生可以从一个 class 到另一个足够快:-)