0

次の問題があります。

イベントには「開始」と「終了」の時間と量があります。両方に MySQL DATETIME を使用します。

「重複するイベントはありません」という制約がある場合、いくつかのチェックなどを行う必要がありますが、それをどのように設計するのですか? ユーザーは5分程度の精度しか必要としませんが、「より単純」/「よりクリーン」であるため、秒で計算したいと思います

開始と終了が「YYYY-MM-DD 12:00:00」-「YYYY-MM-DD 14:00:00」のイベント (A) がある場合

そしてもう一つ

(B) "YYYY-MM-DD 14:00:00"-"YYYY-MM-DD 16:15:00" -> 両方に 14:00:00 が含まれていても、重複していません。

それらが実際に重複していないことを確認するには、使用する必要があります

A.end < B.begin など

または

A.end <= B.begin など AND すべての終了時刻が "DATE HH:MM:00" ではなく "DATE HH:MM:00 (マイナス 1 秒)" になるように "ハック" を作成、つまり A.endその場合、「YYYY-MM-DD 14:00:00」ではなく「YYYY-MM-DD 13:59:59」になります。

1 つ目は最も単純ですが、多数の異なるイベントがあり、「オーバーブッキング」していないこと、つまりイベントの個々の金額が合計金額を超えていないことを確認する必要がある場合 (例: 各イベントの場合人数のテーブルの予約です。常にテーブルの総数を超えることはできません)

4

1 に答える 1

4

日時の範囲を操作する場合、開始時に包括的で終了時に排他的である範囲を使用することは非常に一般的です。例えば:

(using ISO8601 formatting)

Start                  End
2013-04-29T01:00:00Z - 2013-04-29T02:00:00Z
2013-04-29T02:00:00Z - 2013-04-29T03:00:00Z

値が開始点以下で、終了点より大きい (しかし等しくない) 場合、値は範囲内です。上記の例02:00では、最初の範囲ではなく、2 番目の範囲に属します。言い換えると:

Start <= value < End 

または同等に、

Start <= value  AND  End > value

数学では、区間表記法を使用して、これは「半開」区間として知られています。

[Start, End)

これは、 のような値を使用するという考えよりも常に優れたアプローチです01:59:59End - Start期間を得るために減算するかどうかを検討してください。答えは 59 分 59 秒ではなく、1 時間だと思います。

ほとんどの例では という用語Start/Endが使用されていますが、場合によってはBegin/Endまたはが表示されることもありますStart/Stop。個人的には、包括的/排他的な範囲がある場合に使用する最適な用語のセットはStart/Until. 両方の用語が 5 文字であり、アルファベット順に並んでおり、終了日が排他的であることを明示的に伝えるという追加の利点があります。

また、個別のイベントについて話している場合は、タイム ゾーンに関する混乱を避けるために、時刻を UTC として記録する必要があります。これは、多くのタイム ゾーンで夏時間への移行が行われるため、ローカル アプリケーションにとっても重要です。データベースに記録する値があいまいになることは望ましくありません。MySQL では、TIMESTAMPデータ型を使用して、値が UTC として格納されていることをDATETIME確認したり、アプリケーション コードで UTC 値を使用していることが確実な場合にデータ型を使用したりできます。

于 2013-04-29T15:15:15.817 に答える