1

わかりました... それで、CodeIgniter を使用して構築されたカスタム PHP アプリケーションにカレンダーがあり、MySQL データベースからエントリを取得します。エントリ データを含むテーブルには、エントリの日付 ( start_date )、時間 ( start_time )、期間 ( duration )を管理する 3 つのフィールドがあります。ここで、エンドユーザーがエントリを新しい日付および/または時間に移動すると、システムはスケジュールの競合についてこれら 3 つのフィールドをチェックする必要があります。

以下は、クエリで使用される変数の一部です。

$request_entry_id // the id of the entry being moved
$request_start_date // the requested new date
$request_start_time // the requested new time
$request_duration // the duration of the entry being moved (will remain the same)
$end_time = ($request_start_time + $request_duration); // the new end time of the entry being moved

スケジュールの競合を確認するために使用されるクエリは次のとおりです。

SELECT t.id
FROM TABLE t
WHERE t.start_date = '$request_start_date'
AND (j.start_time BETWEEN '$request_start_time' AND '$end_time'))
AND t.id <> $request_entry_id

上記のクエリは、リクエストと同じ日時に開始するエントリをチェックします。ただし、最も効率的な方法で、新しいリクエストが既存のエントリの期間内に収まらないことを確認することも必要です (トリックがあります)。助言がありますか?前もって感謝します!

4

1 に答える 1

2

最初に競合がない場合の条件について考えると、ロジックを理解するのが簡単になります。

新しいイベントは、既存のイベントが開始する前に終了するか、既存のイベントが終了したに開始されます。

競合が存在するためには、上記の否定を採用します。

新しいイベントは、既存のイベントが開始された後に終了、既存のイベントが終了する開始されます。

SQL では:

SELECT t.id
FROM TABLE t
WHERE t.start_date = '$request_start_date'
AND ('$end_time' > t.start_time AND '$request_start_time' < addtime(t.start_time, t.duration))
AND t.id <> $request_entry_id
于 2013-03-28T17:37:15.963 に答える