2

MySQL の日付範囲に関する多くのスレッドを見てきましたが、私が探しているものに対する答えをまだ見つけることができないようです。

日付 - 開始時刻 - 終了時刻の 3 つの列を持つ MySQL テーブルがあります。日付は MySQL の「日付」タイプのフィールドで、開始時刻と終了時刻は両方とも「時刻」タイプのフィールドです。

たとえば、データベースに次のようなエントリがあるとします。このセッションを 1 と呼びましょう。

date = 2011-06-30, startTime = 09:00:00, finishTime = 11:00:00

別のセッションを追加する場合は、既存のセッションと競合しないようにする必要があります。したがって、セッション 1 の開始時間と終了時間の間にあるため、以下は失敗します。

date = 2011-06-30, startTime = 10:00:00, finishTime = 12:00:00

したがって、レコードは既存のセッションの「後」または「前」にのみ挿入できます。

私はPHP/MySQLを使用しており、クエリを実行できることに基づいており、一致する結果が「ある」場合は失敗し、一致する結果が「ない」場合は挿入します。

前もって感謝します。

4

5 に答える 5

4

私はPHP/MySQLを使用しており、クエリを実行できることに基づいています。一致する結果が「ある」場合は失敗し、「一致する結果がない場合」は挿入します。

さて、これを試してみてください。これ:date:は、追加するエントリの日付であり、:start-time:それぞれ:finish-time:の開始時刻と終了時刻です。

SELECT EXISTS (
    SELECT
        1
    FROM
        TableName
    WHERE
        `date` = :date: AND
        ( :start-time: BETWEEN startTime AND finishTime OR
          :finish-time: BETWEEN startTime AND finishTime OR
          startTime BETWEEN :start-time: AND :finish-time:
          )
) AS `Clash`
于 2011-06-29T11:03:13.823 に答える
1

日付の重複検出の問題に直面しました。私の最初のアイデアは Hammerite のソリューションのようなことをすることでしたが、主に 2 つの日付範囲が競合する可能性のあるシナリオが多すぎるため、このソリューションは不完全であることがわかりました。

これを解決するために最終的に使用したクエリは次のようなものでした:

/* overlapping dates */
SELECT * 
FROM my_table
WHERE `date` = $date AND
  NOT (
    `start_time` < $start_time and `finish_time` < $start_time
    OR
    `start_time` > $end_time and `finish_time` > $end_time
  )

詳細については、ここで私のブログを確認できます

于 2013-02-21T08:41:08.943 に答える
0

別の方法でテーブルを構成します。名前付きと。の両方のdatetimeタイプの2つの列があります。session_startsession_end

session_startロジックは次のとおりです。時間がない場合、>または<古いセッションよりも新しいセッションを挿入することはできませんsession_end

于 2011-06-29T10:54:27.453 に答える
0

$ date、$ startTime、および$ finishTimeが、挿入される日付、開始時刻、および終了時刻をそれぞれ格納するPHP変数であると想定します。

$query = 'INSERT INTO `session`
SELECT \'' . $date . '\', \'' . $startTime . '\', \'' . $finishTime . '\'
FROM `session`
WHERE NOT EXISTS (SELECT *
    FROM `session`
    WHERE `date` = \'' . $date . '\'
    AND \'' . $startTime . '\' BETWEEN `startTime` and `finishTime`
)';

お役に立てれば。

于 2011-06-29T11:05:42.127 に答える
0

私は簡単に使用します:

INSERT INTO session
  ( `date`, startTime, finishTime )
  SELECT
  ( $date, $startTime, $finishTime )
  WHERE NOT EXISTS
    ( SELECT
          *
      FROM
          session
      WHERE
            `date` = $date 
        AND $startTime <  finishTime 
        AND  startTime < $finishTime 

    )

2 つの期間を衝突させたい場合は、 を<に変更する必要があります。<=09:00 - 11:0011:00 - 13:00

于 2011-06-29T11:18:42.467 に答える