如何查看2个日期时间之间的房间

时间:2012-05-09 06:59:06

标签: sql database

我正在开发一个可以预订会议室的网络应用程序。我先来解释一下我的数据库是怎样的。

我的表Reservations具有以下设计

  ID           --> int
  ROOMID       --> int
  DATE_BEGIN   --> DATETIME
  DATE_END     --> DATETIME

我还有一个表ROOM,其设计如下

 ID            --> int
 NAME          --> VARCHAR(30)

现在在表reservation中插入一行就像这样

 ID            --> 1
 ROOMID        --> 2
 DATE_BEGIN    --> 2012-01-01 12:02:33
 DATE_END      --> 2012-01-01 14:00:00

现在我做的是,我输入开始日期和结束日期。当我按下按钮时,例如Check availability它会返回此给定日期范围内可用的所有房间名称。

现在我有这个问题:

SELECT zaa.NAME 
FROM ARTICLES_ZAAL zaa
INNER JOIN ARTICLES_RESERVERING res
ON zaa.ID =res.ZAALID
WHERE res.DATUM_BEGIN <> @DATUM_BEGIN
AND res_DATUM_EINDE <> @DATUM_EINDE

我知道还有很多遗漏,但问题是什么。我在一个由Web服务调用的函数中完成所有这些操作。

有人可以帮忙吗?

亲切的问候。

5 个答案:

答案 0 :(得分:4)

其他答案不处理与预约重叠的时间请求,并且BETWEEN不是一个好的选择,因为它是包容性的(因此,如果预订在下午2点结束,并且您希望在下午2点开始,那么它将是是的,这是不正确的。)

试试这个SQL小提琴。你可以乱用所要求的开始和结束日期来检查我的工作,这对我而言是正常的。

http://sqlfiddle.com/#!3/cb682/25

摘录:

select * from Room as ro
where ro.ID not in 
            (
              select re.ROOMID
              from Reservations as re 
              where (DATE_BEGIN >= @start and DATE_BEGIN < @end)
                or (DATE_END >= @start and DATE_END < @end)
             )

答案 1 :(得分:1)

尝试使用BETWEEN

select * from rooms 
where roomid not in(select roomid from reservation where begin_date between given_begin_date and end_date

答案 2 :(得分:0)

您需要捕获以下事实:对于每个给定的开始/结束范围,您有一组现有预留,条件是给定的开始/结束不能落入现有预留集合中(使用{{ 1}},所以如果没有预订房间,预订日期应为LEFT OUTER JOIN):

NULL

答案 3 :(得分:0)

要知道您有@DATUM_BEGIN@DATUM_EINDE的未预留空间。然后,您必须检查@DATUM_BEGINres_DATUM_EINDE的交叉点@DATUM_BEGIN&gt; res_DATUM_EINDE@DATUM_EINDE针对res.DATUM_BEGIN @DATUM_EINDE&lt; res.DATUM_BEGIN SELECT zaa.NAME FROM ARTICLES_ZAAL zaa INNER JOIN ARTICLES_RESERVERING res ON zaa.ID =res.ZAALID WHERE MAX(res_DATUM_EINDE)<@DATUM_BEGIN GROUP BY res.ZAALID INTERSECT SELECT zaa.NAME FROM ARTICLES_ZAAL zaa INNER JOIN ARTICLES_RESERVERING res ON zaa.ID =res.ZAALID WHERE MIN(res.DATUM_BEGIN)>@DATUM_EINDE GROUP BY res.ZAALID

{{1}}

答案 4 :(得分:0)

select * from rooms where roomid not in(select roomid from reservation where (begin_date>=given_begin_date and begin_date<=given_end_date ) or(end_date>=given_begin_date and end_date<=given_end_date))