Shahkalpeshは次のように質問に答えました:
私はこれが間違っていると思うコメントを投稿し、2つの反例を示しました:
私のコメントへの返答として、Shahkalpeshは次のように要求しました:
十分に公平です-はい。少し編集しましたが、質問には次のように書かれています:
- 午前7時から午後1時まで、または
- 午前9時から午後1時まで、または
- 午前9時から午後5時まで。
十分な背景。予定の日付は無視して、時間を考慮するだけです。記録される時間を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未満であるか、またはその両方です。これは書くことと同じです 1 = 1
またはWHERE句のその他のトートロジー。 ]
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')。この式は、「重複」し、「会う」および「会う」を数える行を選択する方法の典型的な例です(「アレンの区間代数 "、たとえば)オーバーラップとして。'>='と'<='を変更すると、オーバーラップとしてカウントされる間隔のセットが変更されます。