teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

取り消し機能がないので、コメントを修正します。

2021/11/02 11:43

投稿

nicorinpana
nicorinpana

スコア55

answer CHANGED
@@ -1,2 +1,2 @@
1
1
  start < endという前提条件で
2
- 終了日時がテーブルのstart未満または開始日時がendよりあとという条件で、レコードが取得できなければ予約可能と考えるが正しいかと思います。
2
+ 終了日時がテーブルのstart未満または開始日時がendよりあとという条件で、レコードが取得できなければ予約可能と考えるが正しいかと思います。

1

申し訳ありません。回答に誤りがありましたので取り消させてください。私の回答では範囲が重複している場合が考慮されていません。

2021/11/02 11:43

投稿

nicorinpana
nicorinpana

スコア55

answer CHANGED
@@ -1,15 +1,2 @@
1
+ start < endという前提条件で
1
- 開始日時がテーブルのstart以上かつ終了日時がend以下で取れる場合、予約不可能と考えればと思います。
2
+ 終了日時がテーブルのstart未満または開始日時がendよりあとという条件、レコードが得できなけ予約不可能と考えるが正しと思います。
2
- SQLは以下のようになるかと
3
- ちなみに質問者さんのSQLでも分かりづらいですが取れると思います。
4
- ただ示されているデータのスタートに17:00があるため、質問者さんのSQLでは時間が被る扱いになりますね。
5
- 2行目のデータの開始日時が2021/11/05 17:01:00だったら問題ないのでは。
6
- 2行目の終了日時と3行目の開始日時もかぶっています。
7
- カラムの定義として、startとendの重複は認めるのか、その場合パラメータとして渡される値は、
8
- その値以上なのかより上なのかをしっかり定義した方がいいと思います。
9
- ```
10
- SELECT * FROM orders
11
- WHERE
12
- start >= '2021-11-05 16:00:00'
13
- AND
14
- end <= '2021-11-05 17:00:00'
15
- ```