用于检查Range的SQL Query

时间:2015-03-03 09:35:40

标签: mysql sql sqlite jdbc

我正在尝试编写一个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分别是我的开始和结束时间。现在,我遇到了麻烦,因为两个子查询都返回了多个值,你不能使用&lt; =符号或&gt; =符号。有没有办法使用IN或NOT IN完成此任务?谢谢!非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这是您问题的简化版,只显示一张表&#39;次&#39;说明这个想法。

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

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,但你想&lt;和&gt;而不是&lt; =和&gt; =因为只要学生能够足够快地从一个班级到另一个班级,你就不会介意范围是否触及: - )