Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL日期重叠,无冲突_Php_Mysql_Date_Range_Overlapping - Fatal编程技术网

Php MySQL日期重叠,无冲突

Php MySQL日期重叠,无冲突,php,mysql,date,range,overlapping,Php,Mysql,Date,Range,Overlapping,我在MySQL中看到了很多关于日期范围的帖子,但我似乎仍然无法找到我所寻找的答案,所以任何帮助都会得到很大的帮助 我有一个MySQL表,有3列,date-startTime-finishTime。日期是MySQL的“日期”类型字段,开始和完成时间都是“时间”类型字段 比如说,我在数据库中有一个条目,如下所示,让我们调用这个会话1 date = 2011-06-30, startTime = 09:00:00, finishTime = 11:00:00 如果我来添加另一个会话,我需要确保它不会

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

我有一个MySQL表,有3列,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,它的基础是可以运行查询,如果“有”匹配结果,那么就失败,如果“没有”匹配结果,那么就插入


提前谢谢。

我会用另一种方式组织表格。我有两个列,都是datetime类型,分别命名为session\u start和session\u end

逻辑是:如果新会话的session\u start time不是>或则不能插入新会话。我使用的是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`

假设$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`
)';

希望这有帮助。

我会使用简单的:

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 

    )

我遇到了日期重叠检测的问题,我的第一个想法是做一些类似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
  )

有关更多详细信息,您可以

如果新会话的开始时间不在现有会话的开始时间和结束时间之间,但其结束时间是?是的,我很抱歉,我没有添加这些条件。谢谢你指点他们,他们工作得很完美!非常感谢!我刚刚意识到,如果两个会话仅在其端点(即一个会话的端点是另一个会话的起点)发生冲突,则会报告冲突。这可能不是你想要的。发生这种情况是因为中间是包容的。可以重写查询,以避免使用BETWEEN,而使用严格的比较运算符。@Hammerite:完全正确。x在a和b之间,它应该被a替换,当有09:00-11:00的会话,而新会话是11:00-13:00时会发生什么。冲突与否?@Rob:那么,两种解决方案之间的冲突就不会起作用,因为它们会产生冲突。