gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 16:02:17 25 4
gpt4 key购买 nike

我一直在思考如何简化这里提出的问题。 Complex MySQL Query - Checking for overlapping DATE intervals

从本质上讲,除去 DATES 的所有花哨魔法,这只是一个检查重叠间隔的问题。毕竟日期可以被认为是数字,这可能会使逻辑更容易。想象一下下表:

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] 不与任何其他间隔重叠。考虑因素:

  • 是的,我可以将整个表放入一个数组中并对其进行 O(N) 搜索。真无聊。
  • 我更喜欢在 MySQL 中执行此操作,这样我就不必每次都拉取任意大的表。

请参见下图。这代表了可以插入和不可以插入的范围。 http://i.stack.imgur.com/jE59w.png

最佳答案

使用以下缩写:

  • [旧] := 现有范围
  • [新] := 插入范围
  • 操作系统 :=(旧)existing_range.start
  • OE :=(旧)existing_range.end
  • NS :=(新)inserting_range.start
  • NE :=(新)inserting_range.end

两个范围(旧的和新的)重叠的条件是:(OS < NE) AND (OE > NS)

虽然解决方案可能并不简单,但实现起来并不困难:

如果新范围完全位于现有范围之前或之后,则不存在重叠:[new] <= [old] OR [old] <= [new]这意味着:

(NE <= OS) OR (OE <= NS)

通过这个语句我们得到重叠的条件:

!( (NE <= OS) OR (OE <= NS) )

现在使用De Morgan's law我们可以把它写成

!(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

关于php - 检查新间隔是否重叠 - MySQL(或 PHP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56084130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com