MYSQLで部屋を利用するための予約システムを作ろうと考えております。
設計として下記を考えてみたのですがおかしいでしょうか。
要件は下記のとおりです。
・A、B、C3つの部屋の利用予約を時間単位でおこなう
・重複する時間は予約できない
・日を跨ぐ予約はできない
テーブル設計
トランID(int)|開始時刻(datetime)|終了時刻(datetime)|部屋ID(int)
時間についてはdatetime式で2013-03-22 12:00:00 と保存させる予定です。
入力を簡素にするため、時刻は時、分個別のプルダウンで30分刻みにしようと考えています。
そこで分からなくなってきたのがデータ保持の方法なのですが、
例えば10:00-12:00と予約入力された場合、datetime式ですと秒まで保存されますので
2012-03-22 10:00:00 - 2012-03-22 12:00:00 となりますよね。
そうなりますと、別の予約で12:00-15:00を確保したい場合、開始時刻は重複してしまうことに
なりますので、テーブルには2013-03-22 10:00:01 - 2013-03-22 11:59:59と登録したほうが
いいのでしょうか。
ただ、これだと時間を変更したい場合の修正の際に困ったことになりそうです。
またこの設計の場合、 開始時刻と終了時刻が他の予約と重複していないかのSQLを
考える場合、非常にやっかいなような気がしてきました。
何か別のよい設計のヒントがあればご教授願えないでしょうか。
宜しくお願いいたします。
No.5ベストアンサー
- 回答日時:
普通(かどうかは知りませんが)こういう要件のときは、
部屋ID=A
で
'2013-03-22 11:00:00'
から
'2013-03-22 15:00:00'
と画面で入力されたとすると、
SELECT count(*) FROM 予約テーブル
WHERE 部屋ID=A
AND 開始時刻<'2013-03-22 15:00:00'
AND 終了時刻>'2013-03-22 11:00:00'
の結果が0でなければ重複しているとしてエラーにします。
00:00は含まれないので、データの持ち方は、00分00秒でOKです。
なにをやっているかの補足:
AND 開始時刻<'2013-03-22 15:00:00'
は、開始時刻が入力した終了時刻以降のものは関係ありません。
(今回の予約時間が終わってから始まります。)
AND 終了時刻>'2013-03-22 11:00:00'
は、終了時刻が入力した開始時刻以前のものは関係ありません。
(今回の予約時間が始まる前に終わってます。)
⇒上記以外とは、今回の予約時間が終わる前に始まり(今回の予約開始前か予約開始後かは問わない)
今回の予約時間が始まる前には終わっていない(今回の予約終了後か予約終了前かは問わない)
予約が既にあるということを調べています。
ありがとうございます!
なるほど、そういう発想で検索すればよかったのですね。
目からウロコです。
確かにそれでいけます!
自身の論理思考の足りなさが恥ずかしい限りです・・。
No.3
- 回答日時:
BETWEENでは常に以上・以下での比較になってしまい、入力開始時刻が終了時刻に一致するだけのものも対象になってしまうのでは?
それよりも、開始時刻同士の一致のみと終了時刻同士の一致のみを条件に含めば開始・終了が両方一致のものも含まれます
~(指定時刻(開始)が開始時刻以上で終了時刻より小) OR (指定時刻(終了)が開始時刻より大で終了時刻以下)
No.2
- 回答日時:
>1.2.の問い合わせで件数が0でしたら重複なしと判断できるのですが、
>いちいち2回の検索をおこなうのもどうなのでしょうか。
ORでつないで1回で検索すれば?
~指定時刻(開始)が開始時刻と終了時刻の間 OR 指定時刻(終了)が開始時刻と終了時刻の間
ふたたびありがとうございます。
なるほど、ORを使えばよかったんですね。
しかし、先ほどのSQLですと別の予約を完全に跨いでしまう時間が入力された場合にはヒットしないことに気づきました。
そこで、ORとbetweenを使ってまた考えてみました。
SELECT * FROM 予約テーブル WHERE 部屋ID=A AND ( 開始日時 BETWEEN '2013-03-22 11:00:00' AND '2013-03-22 15:00:00' OR 終了日時 BETWEEN '2013-03-22 11:00:00' AND '2013-03-22 15:00:00')
理論的にはこれで合っていますでしょうか。
No.1
- 回答日時:
開始時刻のほうの秒だけを常に00秒より大きな値にして設定すれば?
たとえば常に30秒に設定すれば10:00-12:00と12:00-15:00は10:00:30-12:00:00と12:00:30-15:00:00なので重複しませんし、設定時間の変更時に参照しても分単位での値は元の指定値と同じです
あるいは重複確認を値の一致ではなく大小比較で行うことで、時間帯の重複しない開始・終了時刻の一致は重複とみなさないことも可能
ありがとうございます!
秒についてはそのようにすれば、確かに入力時の分にも影響ありませんね。
重複確認についてはお教えいただいた大小比較で2回のselect分を発行する方法を考えました。
1.入力された開始時刻が重複していないか
SELECT * FROM 予約テーブル WHERE 部屋ID=A AND (開始時刻<'2013-03-22 11:00:00' AND 終了時刻>'2013-03-22 11:00:00')
2.入力された終了時刻が重複していないか
SELECT * FROM 予約テーブル WHERE 部屋ID=A AND (開始時刻<'2013-03-22 15:00:00' AND 終了時刻>'2013-03-22 15:00:00')
1.2.の問い合わせで件数が0でしたら重複なしと判断できるのですが、
いちいち2回の検索をおこなうのもどうなのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- エアコン・クーラー・冷暖房機 日立のエアコンのリモコン 5 2023/04/01 00:25
- その他(Microsoft Office) エクセル 条件付き書式 日をまたぐ塗りつぶし 1 2023/01/13 18:00
- 簿記検定・漢字検定・秘書検定 4月から商業高校の会計科に通う予定の中学生です。現在春休みで、簿記検定3級を取得しようと考えており、 1 2023/03/04 14:40
- ホテル・旅館 ヒルトン東京お台場でのサプライズプランへのアドバイス もうすぐ彼氏の誕生日でヒルトン東京お台場でお祝 0 2023/04/18 13:06
- バス・高速バス・夜行バス 非常に取りづらい便の高速バスの予約について 4 2022/09/01 15:13
- 営業・販売・サービス お客様の無断キャンセル、遅刻について質問です。 美容サロンで働いています。 タイトルの通り無断キャン 8 2022/05/04 16:52
- その他(Microsoft Office) 勤務表のエクセル作成で数式を教えてください。 1 2023/01/17 03:27
- Excel(エクセル) 指定した値以上の中で最小値を出したい 7 2022/10/24 21:12
- その他(社会・学校・職場) 時短勤務に制限があるのは普通ですか? 1 2023/02/11 12:03
- 建築学 ネットワーク工程表(1級管工事施工管理) 5 2022/08/24 08:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PostgreSQLのtimestamp型で時間...
-
予約システムでの時間の設計に...
-
Access にて "mm:ss.0" 形式の ...
-
下記の問合せを行うクエリを、 ...
-
フラグをたてるってどういうこ...
-
【SQL】他テーブルに含まれる値...
-
データ削除とSQL*Loaderでのイ...
-
T-SQLで任意の箇所で強制終了す...
-
オラクルのUPDATEで複数テーブル
-
SELECT INTOで一度に複数の変数...
-
既存データをINSERT文にして出...
-
結合したテーブルをSUMしたい
-
右向き、左向きの速度が最大と...
-
SQLで、Join句で結合したテ...
-
エラーを起こす方法
-
平均値のもとめ方
-
UPDATEで既存のレコードに文字...
-
timestampのデータはどのように...
-
selectの単純繰り返し
-
ゼロ未満の場合で更新する場合
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PostgreSQLのtimestamp型で時間...
-
Access にて "mm:ss.0" 形式の ...
-
予約システムでの時間の設計に...
-
SELECT の仕方 (今月のデー...
-
MySQLで期間のUNIQUEってできま...
-
Excelの外部参照と書式設定につ...
-
該当レコードなしでエラーを発...
-
(SQL)かな・カナデータの並べ...
-
Wifi対応ではないプリンタをWif...
-
MS_ACCESSでINSTR関数を使いたい。
-
フラグをたてるってどういうこ...
-
SELECT INTOで一度に複数の変数...
-
【SQL】他テーブルに含まれる値...
-
sqlに記述できない文字
-
UPDATEで既存のレコードに文字...
-
テーブル名が可変の場合のクエ...
-
エラーを起こす方法
-
オラクルのUPDATEで複数テーブル
-
truncate tableを使って複数の...
-
結合したテーブルをSUMしたい
おすすめ情報