このデータで:
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
、指定された開始時刻 ( from
) と終了時刻 ( to
) の間に予約がないため、部屋は利用可能です。
データを操作するための SQL Fiddle は次のとおりです: http://sqlfiddle.com/#!2/3c124/1