此查询返回特定日期占用的房间#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
数据库中不存在包含所有可能时间范围的表。我可以将其编码到查询中吗?
答案 0 :(得分:0)
以此查询为例:
SELECT * FROM Persons WHERE Year='1965'
这个sql查询将返回一个数据集,其中包含'Persons'表中所有'Year'字段等于'1965'的行。正如您所说,您想要反转您的SQL查询,以便返回相反的数据集。这可以在WHERE子句中实现,您可以使用不等于运算符:&lt;&gt;或!=在某些版本的SQL中
SELECT * FROM Persons WHERE Year<>'1965'
或
SELECT * FROM Persons WHERE Year!='1965'
将返回一个数据集,其中包含来自'Persons'表的行,其中的字段不等于'1965'。
希望这有助于您的SQL查询。你只需要实现&lt;&gt;或!=运算符需要从数据库返回相反的数据集,这假设您希望从当前查询返回的数据中得到相反的数据。
如果这不是您想要的,请更新您的问题,以便您清楚地解释您希望它具有的输出 - 示例 - 以便可以进行查询以检索所需的结果。
答案 1 :(得分:0)
让我先告诉你我认为的答案:
我认为你要找的是Between ... And...
。或者更好地说Not(Between .. And..)
。 Between ... And...
是范围运算符。所以x Between 1 And 10 = 1<x<10
和Not 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'
答案 2 :(得分:0)
您需要创建所有可能值的列表。您可以使用以下查询执行此操作: 选择 * 从(选择'2012-01-01 7:00:00'来自双联盟全部 从双联盟中选择'2012-01-01 7:30:00'。 。 。 )次
也就是说,您可以使用union all将数据放在一起。我发现使用Excel将最简单的SQL语句放在一起是最容易的。
也就是说,您应该考虑日历/日历时间表。拥有一个包含每个可能时间段的表格,将来可能对您有所帮助。