查看日期范围的房间可用性

时间:2012-12-20 18:28:23

标签: mysql subquery

你好,我有2个桌子的房间和预订,但我的桌子结构有点不同, 在预订表中有roomid,日期,状态,例如:

101,2012-12-10,0
101,2012-12-11,0
101,2012-12-12,1
101,2012-12-13,0
102,2012-12-10,0
102,2012-12-11,0
102,2012-12-12,0

我希望在2012-12-10和2012-12-13之间找到可用的房间 根据这个要求,只有102号房间应该返回。

我试过

SELECT id 
FROM status 
WHERE status='0' 
  AND date between '2012-12-10' AND '2012-12-13' 
GROUP BY id

它不起作用,因为即使只找到一个可用行,它也会返回101

所以101可用于2012-12-11然后显示可用但不适合我们的数据范围。

6 个答案:

答案 0 :(得分:1)

如果日期有与之相关的时间,您需要执行以下操作:

SELECT id 
FROM status 
WHERE status='0' 
  AND date between '2012-12-10 00:00:00' AND '2012-12-13 23:59:59' 
GROUP BY id

您也可以使用日期(日期)而不是包括时间,但这可能效率较低。

答案 1 :(得分:1)

您应该可以使用以下内容:

SELECT roomid 
FROM status s1
WHERE status='0' 
  AND date between '2012-12-10' AND '2012-12-13' 
  and not exists (select roomid
                  from status  s2
                  where status='1' 
                    AND date between '2012-12-10' AND '2012-12-13'
                    and s1.roomid = s2.roomid)
GROUP BY roomid

请参阅SQL Fiddle with demo

答案 2 :(得分:1)

试试这个:

SELECT rd.* 
FROM room_details rd 
INNER JOIN (SELECT DISTINCT roomid FROM bookings 
            WHERE roomid NOT IN (SELECT roomid FROM bookings 
                                WHERE STATUS =0 AND DATE BETWEEN '2012-12-10' AND '2012-12-13')
                ) AS a ON rd.roomid = a.roomid

答案 3 :(得分:1)

这将选择在您选择的时间间隔内没有status=1行的所有房间。请注意,我没有使用between:如果status=1在12月13日,该空间仍然在该时间间隔内可用,这就是我使用>= and <的原因:

SELECT roomid
FROM status
WHERE `date` >= '2012-12-10'
      AND `date` < '2012-12-13'
GROUP BY roomid
HAVING sum(status.status=1)=0

如果您的桌子中可能还有一些遗失的日子,如果这意味着房间没有预订但也无法使用,您也可以使用此查询:

SELECT roomid
FROM status
WHERE `date` >= '2012-12-10'
      AND `date` < '2012-12-13'
      AND status=0
GROUP BY roomid
HAVING count(*)=DATEDIFF('2012-12-13', '2012-12-10')

检查间隔中的天数是否等于status = 0的行数。

答案 4 :(得分:0)

SQL BETWEEN条件将返回表达式在value1和value2(包括)范围内的记录。因此,对于上述查询,应返回行101,2012-12-10,0

答案 5 :(得分:0)

试试这个:

SELECT roomid
FROM status
WHERE 'date_from' <= "2012-12-10"  AND 'date_to' > "2012-12-10" AND 'status'= 0;