我有一个记录表和每条记录的时间段,例如预订。所以我的记录是这样的:

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/

10-14 15:55