MySQL判断时间段是否重合的两种方法

Theo
Theo
发布时间:2026-10-15| 6人浏览过
原创

本文将介绍如何使用SQL语句有效判断两个时间段(A与B)是否存在重叠情况。通过对比逻辑列举法和取反简化法,帮助开发者准确编写时间区间查询条件。

分析时间重叠的四种核心场景

在进行时间区间比对时,首先需要明确“重叠”的定义。假设存在两个时间段:目标区间 (a, b) 和数据库中的记录区间 (start_time, end_time)。两者发生重合通常对应以下四种情况:

  1. 包含关系(全在内部):记录区间完全处于目标区间内,即 start_time >= a AND end_time <= b。
  2. 右侧交叉(左端点在内):记录的结束时间在目标区间范围内,但开始时间更早,即 end_time >= a AND end_time <= b。
  3. 左侧交叉(右端点在内):记录的开始时间在目标区间范围内,但结束时间更晚,即 start_time >= a AND start_time <= b。
  4. 完全覆盖(跨越两端):记录区间包裹住目标区间,即 start_time <= a AND end_time >= b。

第一种写法:逻辑列举法

最直接的思路是将上述四种可能全部用 OR 连接起来。这种写法虽然直观,容易理解其业务含义,但在实际查询中存在冗余。

-- 原始完整逻辑
SELECT * FROM table WHERE
   (start_time >= a and end_time <= b) -- 被包含了
 or (end_time >= a and end_time <=b)
 or (start_time >= a and start_time <=b)
 or (start_time <= a and end_time >=b);

精简优化

经过逻辑推导可以发现,如果记录的起始时间和结束时间都落在目标区间 (a, b) 之间(即第2种和第3种情况的变体),实际上已经涵盖了第1种“完全被包含”的情况。因此,可以去除冗余条件,将判断简化为三个核心维度:记录的终点落入目标区间、记录的起点落入目标区间、或者记录跨度覆盖了目标区间的边界。

-- 简化后的列举写法
SELECT * FROM table WHERE
    (end_time >= a and end_time <=b) 
 OR (start_time >= a and start_time <=b) 
 OR (start_time <= a and end_time >=b);

第二种写法:取反逻辑法(推荐)

相比于“找重合”,从反面思考“如何不重合”往往更简单。两个时间段如果不重合,只有两种绝对互斥的状态:
1. 记录结束时间早于目标开始时间:end_time < a
2. 记录开始时间晚于目标结束时间:start_time > b

只要排除这两种“完全不接触”的情况,剩下的即为“存在重合”。利用 SQL 的 NOT (... OR ...) 结构,可以用极短的代码实现同样甚至更高效的逻辑判断。

SELECT * FROM table WHERE NOT (start_time > b OR end_time < a);

该写法不仅代码整洁,且避免了多条件 OR 带来的复杂索引评估问题,在处理大数据量时间区间查询时是更为推荐的实践方式。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。