MySQL重叠日期,没有冲突

时间:2011-06-29 10:47:06

标签: php mysql date range overlapping

我在MySQL中看到了很多关于日期范围的线索,但我似乎仍然无法找到我正在寻找的答案,所以任何帮助都会受到极大的欢迎。

我有一个包含3列的MySQL表,date - startTime - finishTime。日期是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,并且基于可以运行查询,如果有“匹配结果”,则失败,如果没有匹配结果,则插入。

提前致谢。

5 个答案:

答案 0 :(得分: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`

答案 1 :(得分:1)

我遇到了日期重叠检测的问题,我的第一个想法是做一些像Hammerite的解决方案,但我发现这个解决方案不完整主要是因为有太多可能的情况,两个日期范围可能会发生冲突:

我最终用于解决此问题的查询类似于:

/* 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
  )

有关详细信息,您可以check my blog here

答案 2 :(得分:0)

我会以不同的方式构建表格。我有两列,datetime类型,名为session_startsession_end

逻辑是:如果session_start时间不是><而不是旧会话session_end,则无法插入新会话。

答案 3 :(得分: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`
)';

希望这有帮助。

答案 4 :(得分: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 

    )

如果您希望两个句点<<=发生冲突,09:00 - 11:00应更改为11:00 - 13:00