我正在开发一个可以预订会议室的网络应用程序。我先来解释一下我的数据库是怎样的。
我的表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服务调用的函数中完成所有这些操作。
有人可以帮忙吗?
亲切的问候。答案 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_BEGIN
与res_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))