質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

1520閲覧

開始日時~終了日時に当てはまるか調べるSQLについて

KJPH34oQBVz8Rd3

総合スコア2

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2021/11/02 08:07

下記のような施設使用予約を開始日時と終了日時で管理するテーブルがあります。

idstart(datetime)end(datetime)
12021/11/05 15:00:002021/11/05 16:00:00
22021/11/05 17:00:002021/11/05 18:00:00
32021/11/05 18:00:002021/11/05 19:00:00
42021/11/05 20:00:002021/11/05 21:00:00

画面で入力した開始日と終了日を使ってその期間に予約が入っているか検索をかける機能を実装しています。

例)
画面で開始日が2021/11/05 16:00:00、終了日が2021/11/05 17:00:00と入力された場合、
入力された期間は他の予約と時間が被らずに予約が取れるかチェックする
この場合は取得結果は0件となり予約可能
※仮に16:30から17:30などの予約が入っていた場合は予約不可

上記の仕様で下記のようなSQLで実装をしましたが期待通りに取得ができません。

sql

1SELECT * FROM 2 `orders` 3WHERE 4 ( 5 `start` BETWEEN '2021-11-05 16:00:00' AND '2021-11-05 17:00:00' 6 OR 7 `end` BETWEEN '2021-11-05 16:00:00' AND '2021-11-05 17:00:00' 8 )

そもそも上記のSQLの考え方が間違っているのでしょうか。。
考え方だけでも助言頂けるとありがたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

たとえば以下のSQLが結果セットを返さない場合、予約の被りなしと判定できます。逆にこのSQLが結果セットを返す場合は予約の被りありといえます。

SQL

1SELECT * 2 FROM orders 3 WHERE '2021-11-05 16:00:00' < `end` 4 AND '2021-11-05 17:00:00' > `start`;

ちなみに「ある範囲が別の範囲と被っているかどうかを調べたい」というのは業務上頻出するため、ググるといろいろ情報が出てきます。参考までにいくつかリンクを提示しますね。

投稿2021/11/02 09:23

neko_the_shadow

総合スコア2225

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KJPH34oQBVz8Rd3

2021/11/03 04:15

なるほど。勉強になります! 参考リンクまで共有して頂きありがとうございます!
guest

0

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

投稿2021/11/02 08:31

編集2021/11/02 11:43
nicorinpana

総合スコア55

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KJPH34oQBVz8Rd3

2021/11/03 04:17

ありがとうございます! お2人のお陰で理解出来ました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問