4

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

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 返回 true

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

4

6 回答 6

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

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

于 2012-12-20T18:34:17.057 回答
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

于 2012-12-20T18:35:36.170 回答
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
于 2012-12-20T18:38:09.920 回答
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')

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

于 2012-12-20T18:39:07.813 回答
0

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

于 2012-12-20T18:43:03.900 回答
0

试试这个:

SELECT roomid
FROM status
WHERE 'date_from' <= "2012-12-10"  AND 'date_to' > "2012-12-10" AND 'status'= 0;
于 2015-06-30T09:28:42.720 回答