3

たくさんの本を収納するテーブルがあります。顧客は、日中いつでも予約できます。新しい予約と競合する予約がまだ存在していないことを確認したいのですが。

その日の予約を見つけて、開始時刻と終了時刻が重なっていないことを確認したいと思います。その日の予約を取得するためにサブ選択クエリを使用してこれを実行しようとしましたが、それらの時間が重複しているかどうかを確認しましたが、機能していないようです。

これが私が使用しているクエリです。(ステータスとアクティブは、私が必要とする他のフィールドです)。関連する日付を見つけて、午前 8 時がこれらの結果の個々の開始時間と終了時間の間にあるかどうか、または午前 9 時 40 分も開始時間と終了時間の間にあるかどうかを確認します。

SELECT event_date, starttime, endtime, status, active 
FROM (SELECT event_date, starttime, endtime, status, active FROM bookings WHERE event_date='2013-07-21' AND status != 'cancelled' AND active !=0 LIMIT 1) AS q1
WHERE ('8:00:00' BETWEEN q1.starttime AND q1.endtime) AND ('9:40:00' BETWEEN q1.starttime AND q1.endtime)

これは使用するのに最適な方法ですか?ありがとう

4

3 に答える 3

4

WHERE ('8:00:00' BETWEEN q1.starttime AND q1.endtime) AND ('9:40:00' BETWEEN q1.starttime AND q1.endtime)

これは、新しい予定 (8 時から 9 時 40 分まで) が既存のアパートの中に完全にあることを意味します。代わりに、 appt の開始または終了が別のものと一致するかどうかを確認したい(と思います):

WHERE ('8:00:00' BETWEEN q1.starttime AND q1.endtime) OR ('9:40:00' BETWEEN q1.starttime AND q1.endtime)

また、内部選択は不要であると確信しています。これは同じ効果があると思います:

SELECT TOP 1 event_date, starttime, endtime, status, active
FROM bookings 
WHERE event_date='2013-07-21' 
    AND status != 'cancelled' 
    AND active != 0
    AND (('8:00:00' BETWEEN q1.starttime AND q1.endtime)
        OR ('9:40:00' BETWEEN q1.starttime AND q1.endtime))
-- if you get a row, then there is a conflicting appt.
于 2013-07-11T12:43:17.600 に答える
4

ある範囲が別の範囲と重複しているかどうかを確認するには、最初に重複しない場合を考えてから、条件を逆にする方が簡単です。次のことは明らかです。

A が B の終了後に開始する場合、または A が B の開始前に終了する場合、2 つの範囲 (A,B)は重複しません。

これを SQL に変換すると、重複する範囲を見つけるための次の条件が得られます。

... WHERE NOT ('8:00:00' > q1.endtime OR '9:40:00' < q1.starttime)

必要に応じて、次のように書き換えることができます。

... WHERE q1.endtime > '8:00:00' AND q1.starttime < '9:40:00'

このようにして、ある間隔が別の間隔を完全に含むなど、すべてのコーナー ケースを処理します。

于 2013-07-11T12:51:08.663 に答える
1

私は同じ問題に遭遇し、投稿されたソリューションを使用しましたが、例として前のレコードが新しいレコードにある場合に見つかった別のバグがあります

データベースのレコードは starttime 8:30:00 endtime 9:00:00 です

この場合、これで一致する行が見つからないため、レコードが追加されます

SELECT TOP 1 event_date, starttime, endtime, status, active
FROM bookings 
WHERE event_date='2013-07-21' 
    AND status != 'cancelled' 
    AND active != 0
    AND (('8:00:00' BETWEEN q1.starttime AND q1.endtime)
        OR ('9:40:00' BETWEEN q1.starttime AND q1.endtime))

この問題を解決するには、開始時刻または終了時刻が次のように新しいエントリの間にあるかどうかを確認する必要があります

SELECT TOP 1 event_date, starttime, endtime, status, active
FROM bookings 
WHERE event_date='2013-07-21' 
    AND status != 'cancelled' 
    AND active != 0
    AND (('8:00:00' BETWEEN q1.starttime AND q1.endtime)
        OR ('9:40:00' BETWEEN q1.starttime AND q1.endtime)
        OR (q1.starttime BETWEEN '8:00:00' AND '9:40:00')
        OR (q1.endtime BETWEEN 8:00:00' AND '9:40:00')
)
于 2016-10-19T18:12:20.043 に答える