2

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

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

提前致谢。

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 的解决方案,但我发现这个解决方案不完整,主要是因为两个日期范围可能发生冲突的情况太多:

我最终用来解决这个问题的查询类似于:

/* 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类型,命名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 

    )

如果您想要两个句点并发生冲突,<则应更改为。<=09:00 - 11:0011:00 - 13:00

于 2011-06-29T11:18:42.467 回答