我有一个记录表和每条记录的时间段,例如预订。所以我的记录是这样的:
Table-reservations
id room datefrom dateto
1 'one' '2015-09-07' '2015-09-12'
2 'two' '2015-08-11' '2015-09-02'
3 'three' '2015-06-11' '2015-06-14'
4 'two' '2015-07-30' '2015-08-10'
5 'four' '2015-06-01' '2015-06-23'
6 'one' '2015-03-21' '2015-03-25'
...
n 'nth' '2015-06-01' '2015-07-03'
还有一个包含房间 ID、房间号和房间类型的表格,如下所示:
Table-rooms
idrooms room roomtype
1 'one' 'simple'
2 'two' 'simple'
3 'three' 'double'
...
nx 'nth' 'simple'
正如您所看到的,有些房间出现了多次,但时间不同,因为它们是在不同的时间段预订的。
我需要通过 SQL 获取的是在给定时间段内可用的房间列表。
所以像(伪代码):
Select room from table where there is no reservation on that room between 2015-08-13 and 2015-08-26
我怎样才能做到这一点?
所以我将有一个 fromdate 和一个 todate,我将不得不在查询中使用它们。
请问各位大侠能给指点一下吗?
现在我使用以下 sql 来获取现在可用的房间列表
select * from rooms
where idrooms not in
(
select idroom from rezervations where
((date(now())<=dateto and date(now())>=datefrom)or(date(now())<=dateto and date(now())<=datefrom))
)
order by room
最佳答案
您需要检查“日期自”小于或等于范围内的结束日期且“截止日期”大于或等于范围内的开始日期的记录不存在。
select t1.room
from reservations t1
where not exists (
select *
from reservations t2
where t2.room = t1.room
and t2.datefrom <= '2015-08-26'
and t2.dateto >= '2015-08-13'
)
group by room
你可以在这里尝试:http://sqlfiddle.com/#!9/cbd59/5
我是这个网站的新手,所以它不会让我发表评论,但我认为第一个答案的问题是运营商应该被逆转。
正如之前的评论中提到的,这只有在所有房间都有预订记录的情况下才有好处。如果没有,最好像这样从你的房间表中选择:http://sqlfiddle.com/#!9/0b96e/1
select room
from rooms
where not exists (
select *
from reservations
where rooms.room = reservations.room
and reservations.datefrom <= '2015-08-26'
and reservations.dateto >= '2015-08-13'
)
关于mysql - 从所需期间与现有期间不重叠的表中选择 *,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32768245/