Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.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
检查新间隔是否重叠-MySQL(或PHP)_Php_Mysql_Scheduling_Intervals - Fatal编程技术网

检查新间隔是否重叠-MySQL(或PHP)

检查新间隔是否重叠-MySQL(或PHP),php,mysql,scheduling,intervals,Php,Mysql,Scheduling,Intervals,我一直在思考如何简化这里提出的问题 在它的核心,减去所有与日期有关的奇妙的魔法,这只是一个检查重叠间隔的问题。毕竟,日期可以被认为是数字,这可能会使逻辑更简单。想象下表: Schedules schedule_id | start | end 1 | 1 | 3 2 | 4 | 7 3

我一直在思考如何简化这里提出的问题

在它的核心,减去所有与日期有关的奇妙的魔法,这只是一个检查重叠间隔的问题。毕竟,日期可以被认为是数字,这可能会使逻辑更简单。想象下表:

Schedules
schedule_id     |     start     |       end 
1               |       1       |       3
2               |       4       |       7                
3               |       8       |       13
4               |      15       |       16
5               |      18       |       24
6               |      25       |       28
我试图插入一个新的间隔,这样[a,b]就不会与任何其他间隔重叠。考虑事项:

是的,我可以将整个表拉入一个数组,并对其进行搜索。那太无聊了。 我更喜欢在MySQL中这样做,这样我就不必每次都下拉一个任意大的表。
请参见下图。这表示可以插入和不能插入的内容的界限

您可以将插入语短语设置为:

insert into schedules(start, end)
    select s, e
    from (select $start s, $end as e) t
    where not exists (select 1
                      from schedules s2
                      where s.start <= t.end and s.end >= t.start
                     );

仅当值不与表中的现有行重叠时,才会插入该值。

使用以下缩写:

[旧]:=现有范围 [新]:=插入范围 OS:=旧的现有_范围。开始 OE:=旧的现有_范围。结束 NS:=新插入范围。开始 NE:=新插入范围。结束 新旧两个范围重叠的条件是:OSNS

虽然解决方案可能并不琐碎,但实现这一目标并不难:


如果新范围完全位于现有范围之前或之后,则不存在重叠:[new]要插入的间隔是多少?如果只需要任何值,则选择最大结束值并为开始添加一个值。然后,您可以将“结束”设置为更大的值。@GordonLinoff-我想插入一个任意间隔,这样就不会与任何其他间隔发生冲突。间隔可以是任意长度。根据我发布的图片,顶部的小间隔将是有效的,因为它不冲突,而在底部,我试图表示我能想到的所有可能的冲突。基本上,我的新时间间隔是运行到还是包含在现有的任何内容中?我的新间隔中是否有任何内容?从计划中选择*,其中start=16将返回您建议的插入冲突的所有间隔。这在蓝色的情况下不起作用。当然,我们从开始=17的日程表中选择*但是橙色包含在蓝色想要去的地方。这也不能避免查找时的错误。我从查询中得到了所有这些行,但我仍然必须对它们进行搜索。行1是否重叠?第2行是否重叠,第3行是否重叠…在蓝色的情况下,开始=14。在任何情况下,它都是有效的。
(NE <= OS) OR (OE <= NS)
!( (NE <= OS) OR (OE <= NS) )
!(NE <= OS) AND !(OE <= NS)
(NE > OS) AND (OE > NS)
(OS < NE) AND (OE > NS)
SELECT o.*
FROM Schedules o
WHERE o.start < :new_end
  AND o.end   > :new_start