日期之间和特定时间之间的SQL免费房间

时间:2017-01-17 20:17:04

标签: sql

我已经阅读了一些关于寻找可用房间的文章,但是我无法让我的版本工作。

有人可以查看我的SQL,也许可以解释一下我的问题。

RoomTBL(RoomNo, RoomName)
LessonsTBL(LessonID, RoomID, StaffID, TimeSlot)
DatesTBL(DateID, LessonID, startDate, endDate)

我想在StartDate和endDate之间的特定TimeSlot上找到可用的房间。 (它是学校的预订系统)

我试过了

SELECT RoomNumber 
FROM RoomTBL 
WHERE RoomNumber NOT IN (SELECT RoomNumber 
                   FROM LessonsTBL LT 
                   JOIN DatesTBL DT ON LT.LessonID = DT.LessonID  
                   Where(DT.startDate <= '2016-03-21' AND DT.endDate >= '2016-03-21') 
                   OR (DT.startDate < '2016-04-21' AND DT.endDate >= '2016-04-21') 
                   OR ('2016-03-21' <= DT.startDate AND '2016-04-21' >= DT.startDate)
                   AND LT.TimeSlot = 1)

但它没有返回任何房间(我有6个房间完全没有使用)我希望我已正确解释了这个问题。

毫无疑问我错过了什么,谢谢。

1 个答案:

答案 0 :(得分:1)

我想我已经理解了你要做的事情,但是你试图从LessonsTBL中选择RoomNumber(这不是任何表中的字段)。我在这个答案中做了很多假设,所以请澄清我猜错了。

您似乎正在寻找在“2016-03-21”和“2016-04-21”之间的任何日期都没有预订第一个时段的房间

SELECT RoomID
FROM LessonsTBL
WHERE RoomID NOT IN
 (SELECT RoomID 
  FROM LessonsTBL LT JOIN DatesTBL ON LT.LessonID = DT.LessonID
  WHERE LT.TimeSlot = 1 AND (DT.startDate BETWEEN '2016-03-21' AND '2016-04-21') OR (DT.endDate BETWEEN '2016-03-21' AND '2016-04-21')

除非您需要RoomName,否则您不需要RoomTBL。