SQL 如何查询区间重叠的数据?

发布时间 - 2026-01-20 00:00:00    点击率:
判断区间重叠应采用“不重叠”的反向逻辑:两区间[A1,A2]与[B1,B2]不重叠当且仅当A2=a_start,并注意处理NULL和数据类型一致性。

判断区间重叠,核心是用“不重叠”的反向逻辑来写条件,比直接判断重叠更简洁可靠。

理解区间不重叠的两种情况

两个区间 [A1, A2] 和 [B1, B2](假设左闭右闭),它们完全不重叠只有两种可能:

  • A2
  • B2

因此,只要这两个条件都不成立,就说明存在重叠。SQL 中可直接写成:

WHERE NOT (a_end < b_start OR b_end < a_start)

等价于:

WHERE a_end >= b_start AND b_end >= a_start

查自身表中互相重叠的记录(自连接)

比如一张 events 表,有 idstart_timeend_time,要找出所有与其他事件时间重叠的事件:

SELECT DISTINCT e1.id, e1.start_time, e1.end_time
FROM events e

1 INNER JOIN events e2 ON e1.id != e2.id AND e1.end_time >= e2.start_time AND e2.end_time >= e1.start_time;

注意:e1.id != e2.id 避免自己和自己匹配;DISTINCT 防止同一事件因多次重叠被重复列出。

查某固定区间与表中哪些记录重叠

例如:查 2025-05-01 09:00 到 2025-05-01 12:00 这个时间段内,有哪些订单的配送时间与之重叠:

SELECT *
FROM orders
WHERE delivery_end >= '2025-05-01 09:00'
  AND delivery_start <= '2024-05-01 12:00';

这里用的是「固定区间 [S, E] 与动态区间 [a, b] 重叠」的通用写法:
b >= S AND a —— 更直观,推荐日常使用。

注意边界和数据类型

重叠判断对边界敏感:

  • 若区间为左闭右开(如 [start, end)),条件应改为 a_end > b_start AND b_end > a_start
  • 确保 startend 字段类型一致(都是 DATETIME 或都是 TIMESTAMP),避免隐式转换出错
  • 如果字段允许 NULL,需额外处理,例如加 WHERE start_time IS NOT NULL AND end_time IS NOT NULL


# 隐式转换  # sql  # 数据类型  # NULL  # timestamp  # 事件  # 都是  # 两种  # 的是  # 都不  # 这两个  # 要找  # 与之  # 可直接  # 来写  # 为左 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 详解Android图表 MPAndroidChart折线图  香港服务器网站推广:SEO优化与外贸独立站搭建策略  图册素材网站设计制作软件,图册的导出方式有几种?  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  网站制作软件有哪些,制图软件有哪些?  如何注册花生壳免费域名并搭建个人网站?  ,南京靠谱的征婚网站?  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  BootStrap整体框架之基础布局组件  HTML 中如何正确使用模板变量为元素的 name 属性赋值  如何在 React 中条件性地遍历数组并渲染元素  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  浅析上传头像示例及其注意事项  Laravel如何使用Blade组件和插槽?(Component代码示例)  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  如何在云指建站中生成FTP站点?  Internet Explorer官网直接进入 IE浏览器在线体验版网址  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  如何挑选优质建站一级代理提升网站排名?  原生JS实现图片轮播切换效果  Laravel怎么实现模型属性的自动加密  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  网站建设要注意的标准 促进网站用户好感度!  Java类加载基本过程详细介绍  如何快速搭建安全的FTP站点?  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  js代码实现下拉菜单【推荐】  Laravel如何使用查询构建器?(Query Builder高级用法)  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  详解jQuery中基本的动画方法  创业网站制作流程,创业网站可靠吗?  使用豆包 AI 辅助进行简单网页 HTML 结构设计  JavaScript模板引擎Template.js使用详解  Python正则表达式进阶教程_复杂匹配与分组替换解析  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  如何在万网ECS上快速搭建专属网站?  Swift中switch语句区间和元组模式匹配  详解阿里云nginx服务器多站点的配置  Python3.6正式版新特性预览  如何快速搭建虚拟主机网站?新手必看指南  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  如何快速上传自定义模板至建站之星?  Laravel如何升级到最新版本?(升级指南和步骤)  如何在IIS7中新建站点?详细步骤解析  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  如何在服务器上三步完成建站并提升流量?  EditPlus 正则表达式 实战(3)