3

对不起,如果标题有点模糊..

我有一个如下所示的数据库:

orderid | roomname | date(DATE) | from(TIME) | to(TIME)

示例数据:

1231 | E12 | 2013-04-05 | 07:00:00 | 10:00:00
1671 | E12 | 2013-04-05 | 13:00:00 | 14:00:00

例如,我正在搜索某个日期,显然当天获得了所有预订。正如您在示例数据中看到的,房间在 10:00:00 到 13:00:00 之间可用。我怎么能抓住这个?

我正在考虑循环时间 07:00:00-16:00:00 (每个查询一个)并检查是否从 sql 获得任何结果。如果我得到结果,我会知道房间很忙,但由于这里有未知数(例如 08:00:00 和 09:00:00 不存在),我会得到误报。

这里有什么提示吗?

4

2 回答 2

2

一种方法是使用“日历表”,或者如果您只对某一天感兴趣,可以使用“时钟表”。下面(粗略地)说明了如何使用它。

SELECT clock.time AS available
FROM clock
LEFT JOIN bookings ON clock.time BETWEEN bookings.from AND bookings.to
                  AND bookings.date = '2013-01-01' 
WHERE bookings.id IS NULL

http://www.brianshowalter.com/calendar_tables是如何在 MySQL 中创建日历的示例

于 2013-04-06T22:26:13.783 回答
1

有了这些数据:

create table rooms
(
  orderid int not null,
  roomname varchar(8) not null,
  date date not null,
  `from` time not null,
  `to` time not null
);

insert into rooms values (1231, 'E12', '2013-04-05', '07:00', '10:00');
insert into rooms values (1671, 'E12', '2013-04-05', '13:00', '14:00');

要获取可用的时间间隔/时隙,您可以发出以下查询:

SELECT DATE_FORMAT(r1.`to`, '%T') AS `From`, DATE_FORMAT(min(r2.`from`), '%T') AS `To`
FROM
  rooms r1 JOIN rooms r2
  ON r1.`to`< r2.`from`
WHERE r1.date = '2013-04-05' AND r1.roomname = 'E12'
GROUP BY r1.`to`
HAVING
  NOT EXISTS (SELECT NULL FROM rooms r3
              WHERE r1.`to` < r3.`to`
              AND min(r2.`from`) > r3.`from`)

上面的查询将返回:

10:00:00    13:00:00

这是 SQL 小提琴:http ://sqlfiddle.com/#!2/3c124/25

注意:以上查询由@fthiella改编自此答案:

https://stackoverflow.com/a/14139835/114029


使用此附加查询:

SELECT (COUNT(*) = 0) AS Available
    FROM rooms
    WHERE roomname = 'E12' AND date = '2013-04-05' AND
    (
        (`from` < MAKETIME(10,00,00) AND `to` > MAKETIME(10,00,00)) OR
        (`from` < MAKETIME(13,00,00) AND `to` > MAKETIME(13,00,00))
    )   

它将返回,即在给定的开始时间 ( ) 和结束时间 ( )1之间没有预订,因此房间可用。fromto

这是使用数据的 SQL Fiddle:http ://sqlfiddle.com/#!2/3c124/1

于 2013-04-06T22:41:28.263 回答