3

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

我有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 服务调用的函数中完成所有这些工作。

有人可以帮忙吗?

亲切的问候。

4

5 回答 5

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)
             )
于 2012-05-09T07:26:09.393 回答
1

尝试使用 BETWEEN

select * from rooms 
where roomid not in(select roomid from reservation where begin_date between given_begin_date and end_date
于 2012-05-09T09:33:56.273 回答
0

要知道你有没有预订的房间@DATUM_BEGIN@DATUM_EINDE。然后你必须检查where >和where <的@DATUM_BEGIN交集。res_DATUM_EINDE@DATUM_BEGINres_DATUM_EINDE@DATUM_EINDEres.DATUM_BEGIN@DATUM_EINDEres.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
于 2012-05-09T07:13:34.267 回答
0

您需要捕捉到这样一个事实,即对于每个给定的开始/结束范围,您有一组现有的预订,条件是给定的开始/结束不能属于现有预订的集合(使用 a LEFT OUTER JOIN,所以如果房间不保留预订日期应该是NULL):

SELECT DISTINCT zaa.NAME  
FROM ARTICLES_ZAAL zaa 
LEFT OUTER JOIN ARTICLES_RESERVERING res 
ON zaa.ID = res.ZAALID 
WHERE ((res.DATUM_BEGIN NOT BETWEEN @DATUM_BEGIN AND @DATUM_EINDE OR (res.DATUM_BEGIN IS NULL))
AND ((res.DATUM_EINDE NOT BETWEEN @DATUM_BEGIN AND @DATUM_EINDE) OR (res.DATUM_EINDE IS NULL))
于 2012-05-09T07:05:41.430 回答
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)) 
于 2012-05-09T07:28:32.057 回答