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 (それぞれに 1 つのクエリ) をループして、SQL から結果が得られるかどうかを確認することを考えていました。結果が得られれば、部屋が混雑していることがわかりますが、ここには不明な点があるため (例: 08:00:00 と 09:00:00 は存在しません)、これについて誤検知が発生します。

ここにヒントはありますか?

4

2 に答える 2

2

1 つの方法は、「カレンダー テーブル」を使用することです。または、1 日だけに関心がある場合は、「クロック テーブル」を使用します。以下は、(大まかに) どのように使用するかを示しています。

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、指定された開始時刻 ( from) と終了時刻 ( to) の間に予約がないため、部屋は利用可能です。

データを操作するための SQL Fiddle は次のとおりです: http://sqlfiddle.com/#!2/3c124/1

于 2013-04-06T22:41:28.263 に答える