1

此查询返回给我特定日期占用的房间 #077 的列表;如何反转此查询并仅显示 07:00:00 到 22:00:00 之间不在数据库中的时间?(间隔 30 分钟),每节课只需要 1 小时 30 分钟

select 
    *
from
    (select 
        rooms.id, rooms.number, rooms.building, rooms.capacity
    from
        rooms) R1,
    (select 
        exam_schedules.room_id,
            exam_schedules.day,
            exam_schedules.start_time,
            exam_schedules.end_time
    from
        exam_schedules) R2
where
    R2.room_id = R1.id and R2.day = 'tuesday' and R1.number = '077'

这是结果:

ID  number  Bulding Capacity    room_id day start_time  end_time
1   077 ACT 12  1   tuesday 10:30:00    12:00:00

但我需要下面显示的结果(这几乎显示了考试不占用的可用时间,并且不能被其他考试占用,因为它可能会导致安排问题:例如,如果考试已经安排在 10.30,只有应该显示 9.00(不是 9.30),因为如果显示 9.30 - 它会导致冲突:9.30+1.30 = 11.00 - 但我已经为这个房间安排了 10.30-12.00)

 1  077 ACT 12  1   tuesday 07:00:00
 1  077 ACT 12  1   tuesday 07:30:00
 1  077 ACT 12  1   tuesday 08:00:00
 1  077 ACT 12  1   tuesday 08:30:00
 1  077 ACT 12  1   tuesday 09:00:00
//note that time frame from 9.30-10.30 is not available since there is a class at 10.30 scheduled already
//note that time period 10.30-<12.00 not shown since class is already scheduled for this timeframe 10.30-12.00
 1  077 ACT 12  1   tuesday 12:00:00
 1  077 ACT 12  1   tuesday 12:30:00
 1  077 ACT 12  1   tuesday 13:00:00
 1  077 ACT 12  1   tuesday 13:30:00
 1  077 ACT 12  1   tuesday 14:00:00
 1  077 ACT 12  1   tuesday 14:30:00
 1  077 ACT 12  1   tuesday 15:00:00
 1  077 ACT 12  1   tuesday 15:30:00
 1  077 ACT 12  1   tuesday 16:00:00
 1  077 ACT 12  1   tuesday 16:30:00
 1  077 ACT 12  1   tuesday 17:00:00
 1  077 ACT 12  1   tuesday 17:30:00
 1  077 ACT 12  1   tuesday 18:00:00
 1  077 ACT 12  1   tuesday 18:30:00
 1  077 ACT 12  1   tuesday 19:00:00
 1  077 ACT 12  1   tuesday 19:30:00
 1  077 ACT 12  1   tuesday 20:00:00
 1  077 ACT 12  1   tuesday 20:30:00
 1  077 ACT 12  1   tuesday 21:00:00
 1  077 ACT 12  1   tuesday 21:30:00
 1  077 ACT 12  1   tuesday 22:00:00

数据库中不存在包含所有可能时间范围的表。我可以将其编码到查询中吗?

4

3 回答 3

0

以这个查询为例:

SELECT * FROM Persons WHERE Year='1965'

此 sql 查询将返回一个数据集,其中包含“Persons”表中所有“Year”字段等于“1965”的所有行。正如您所说,您想反转您的 sql 查询,以便它返回相反的数据集。这在 WHERE 子句中成为可能,您可以在其中使用不等于运算符:<> 或 != 在某些 SQL 版本中

SELECT * FROM Persons WHERE Year<>'1965' 

或者

SELECT * FROM Persons WHERE Year!='1965'

将返回一个数据集,其中包含“Persons”表中的字段不等于“1965”的行。

希望这对您的 sql 查询有所帮助。您只需要在需要从数据库返回相反数据集的地方实现 <> 或 != 运算符,这是假设您想要与当前查询已经返回的数据中的相反数据。

如果这不是您想要的,请更新您的问题,以便清楚地解释您期望它具有的输出 - 一个示例 - 以便可以进行查询以检索所需的结果。

于 2012-04-21T04:38:22.230 回答
0

让我先给你我认为的答案:
我认为你正在寻找的是Between ... And.... 或者更好的说法Not(Between .. And..)Between ... And...是范围运算符。所以 x Between 1 And 10 = 1<x<10Not x Between 1 And 10 = x<1 || x>10。查询的某些部分对我来说是完全错误的:
为什么你有这个select *?您可以只加入到表中,例如:

select 
    rooms.id, rooms.number, rooms.building, rooms.capacity,exam_schedules.room_id,
        exam_schedules.day,
        exam_schedules.start_time,
        exam_schedules.end_time
from
    rooms,exam_schedules
where
    exam_schedules.room_id = rooms.id and exam_schedules.day = 'tuesday' and rooms.number = '077'
于 2012-04-21T04:44:45.043 回答
0

您需要创建所有可能值的列表。您可以使用如下查询来执行此操作: select * from (select '2012-01-01 7:00:00' from dual union all select '2012-01-01 7:30:00' from dual union all ... ) 次

也就是说,您可以使用 union all 将数据放在一起。我发现使用 Excel 将完成这项工作所需的 SQL 语句放在一起最容易。

也就是说,您应该考虑日历/日历时间表。拥有一个包含每个可能时间段的表格可能会在将来对您有所帮助。

于 2012-04-23T01:54:08.283 回答