Shahkalpesh はこの質問に次のように答えました。
ORが必要だと思います。
SELECT * FROM appts
WHERE (timeStart >='$timeStart'
OR timeEnd <='$timeEnd')
AND dayappt='$boatdate'
これは間違っていると思うというコメントを投稿し、反例をいくつか示しました。
これは明らかに間違っています - @ShaneD は正しいです。たとえば、05:00 から 06:00 の間の予約が選択されます。これは、実際の終了時刻が、質問したどの終了時刻よりも短いためです。同様の理由で、18:00 以降のレンタルも受け取ります。
私のコメントへの返答として、Shahkalpesh は次のように要求しました。
予想される出力を含むデータと入力パラメーターを含む別の返信を投稿していただけますか?
十分に - はい。少し編集して、質問は次のように述べています。
ロジックは、ボートのレンタルを予約できるということです
- 午前7時から午後1時まで、または
- 午前9時から午後1時まで、または
- 午前9時から午後5時まで。
その範囲内に予定がある場合、予定を返すはずですが、一貫性がないことが証明されています。午前 9 時から午後 1 時までを選択すると、...
背景は十分。予定の日付は無視して、時間だけを考慮してください。記録される時間を hh:mm 形式に制限する簡単な方法があると思います。すべての DBMS が実際にそれを提供しているわけではありませんが、hh:mm:ss を処理するための拡張機能は簡単です。
Appointments
Row timeStart timeEnd Note
1 07:00 13:00 First valid range
2 09:00 13:00 Second valid range
3 09:00 17:00 Third valid range
4 14:00 17:00 First plausibly valid range
5 05:00 06:00 First probably invalid range
6 18:00 22:30 Second probably invalid range
09:00 ~ 13:00 の範囲で重複する予定を検索すると、Shahkalpesh の (単純化された) クエリは次のようになります。
SELECT * FROM Appointments
WHERE (timeStart >= '09:00' OR timeEnd <= '13:00')
これにより、6 行すべてのデータが返されます。ただし、行 1、2、3 のみが 09:00 ~ 13:00 の時間帯と重複しています。行 1、2、および 3 が唯一の有効な代表的な予定値である場合、Shahkalpesh のクエリは正しい答えを生成します。ただし、行 4 (もっともらしいと思います) が許可されている場合は、返されるべきではありません。同様に、5 行目と 6 行目 (存在する場合) は返されません。[実際に timeStart <= timeEnd
は、テーブル内のすべての行を想定すると (そして、混乱させる NULL 値はありません)、Shahkalpesh のクエリは 09:00-13:00 のクエリに対して任意の行のデータを返すことがわかります。行の時刻が 09:00 より大きいか、終了時刻が 13:00 未満であるか、またはその両方です。これは、WHERE 句での書き込み 1 = 1
またはその他のトートロジーと同じです。]
ShaneD のクエリを (簡略化して) 考えると、次のようになります。
SELECT * FROM Appointments
WHERE timeStart <= '13:00' AND timeEnd >= '09:00'
行 1、2、および 3 も選択されていることがわかりますが、行 4 (timeStart > '13:00' のため)、5 (timeEnd < '09:00' のため)、および 6 (timeStart > '13 のため) は拒否されます。 00')。この式は、「重なり合う」行を選択する方法の典型的な例であり、「出会う」と「出会う」(たとえば、「アレンの間隔代数」を参照) を重なりとして数えます。「>=」および「<=」を変更すると、重複としてカウントされる間隔のセットが変更されます。