当前位置: 首页 > news >正文

sql 时间交集

任务(取时间交集)

前端输入开始时间和结束时间,通过sql筛选出活动开始时间和活动结束时间再开时时间和结束时间有交集的活动

想法:

前后一段时间内遇到了类似取交集的,从网上找到了两种写法,再结合GPT等工具比对了,记录该文章,若有错误请指正。

代码

-- 原始查询
SELECT *
FROM activities
WHERE (activity_start_time <= :input_end_time AND activity_end_time >= :input_start_time)OR(activity_start_time >= :input_start_time AND activity_start_time <= :input_end_time)OR(activity_end_time >= :input_start_time AND activity_end_time <= :input_end_time)-- 简化查询
SELECT *
FROM activities
WHERE activity_start_time <= :end_inputAND activity_end_time >= :start_input;

● 原始查询: 这个查询语句比较复杂,它通过三个条件的组合来筛选数据。这三个条件分别表示:
○ 活动的开始时间在输入的结束时间之前,并且活动的结束时间在输入的开始时间之后。
○ 活动的开始时间在输入的开始时间之后,并且活动的开始时间在输入的结束时间之前。
○ 活动的结束时间在输入的开始时间之后,并且活动的结束时间在输入的结束时间之前。
● 简化查询: 这个查询语句相对简单,它只用两个条件来筛选数据。这两个条件表示:
○ 活动的开始时间在输入的结束时间之前。
○ 活动的结束时间在输入的开始时间之后。

结论

经过分析,这两个查询语句是等价的。简化后的查询语句通过更简洁的条件表达了与原始查询相同的含义。

其他证明材料

-- 创建测试表
CREATE TABLE IF NOT EXISTS activities (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255),activity_start_time DATETIME,activity_end_time DATETIME
);-- 清空表
TRUNCATE TABLE activities;-- 插入测试数据
INSERT INTO activities (name, activity_start_time, activity_end_time) VALUES('Activity 1', '2023-01-01 10:00:00', '2023-01-01 12:00:00'),('Activity 2', '2023-01-01 11:00:00', '2023-01-01 13:00:00'),('Activity 3', '2023-01-01 13:00:00', '2023-01-01 15:00:00'),('Activity 4', '2023-01-01 09:00:00', '2023-01-01 11:30:00'),('Activity 5', '2023-01-01 14:00:00', '2023-01-01 16:00:00');-- 定义测试案例
SET @test_cases = '
(''2023-01-01 10:30:00'', ''2023-01-01 14:30:00''),
(''2023-01-01 09:00:00'', ''2023-01-01 11:00:00''),
(''2023-01-01 12:00:00'', ''2023-01-01 13:00:00''),
(''2023-01-01 08:00:00'', ''2023-01-01 17:00:00''),
(''2023-01-01 15:30:00'', ''2023-01-01 16:30:00'')
';-- 创建临时表来存储测试案例
CREATE TEMPORARY TABLE test_cases (start_time DATETIME,end_time DATETIME
);-- 将测试案例插入临时表
SET @sql = CONCAT('INSERT INTO test_cases (start_time, end_time) VALUES ', @test_cases);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;-- 执行测试并显示结果
SELECT tc.start_time,tc.end_time,CASE WHEN (SELECT COUNT(*) FROM activities WHERE (activity_start_time <= tc.end_time AND activity_end_time >= tc.start_time)OR (activity_start_time >= tc.start_time AND activity_start_time <= tc.end_time)OR (activity_end_time >= tc.start_time AND activity_end_time <= tc.end_time)) = (SELECT COUNT(*) FROM activities WHERE activity_start_time <= tc.end_timeAND activity_end_time >= tc.start_time)THEN '等价'ELSE '不等价'END AS 结果
FROM test_cases tc;-- 清理
DROP TEMPORARY TABLE test_cases;

这个脚本做了以下几件事:

  1. 创建并填充了 activities 表,包含了多个活动的开始和结束时间。
  2. 定义了多个测试案例,覆盖了不同的时间范围。
  3. 创建了一个临时表来存储这些测试案例。
  4. 对每个测试案例,执行两个查询并比较它们的结果。
  5. 显示每个测试案例的结果,指明两个查询是否等价。
    测试案例包括:
  6. 跨越多个活动的时间范围
  7. 仅覆盖一个活动的开始部分
  8. 仅覆盖一个活动的结束部分
  9. 覆盖所有活动的时间范围
  10. 不覆盖任何活动的时间范围

相关文章:

  • Oracle 相关的工具使用 SQL Developer , sqlplus
  • 解决键盘弹起上抬顶部的问题,绑定手势问题
  • 【专题总结】【一文解决】C++多继承下的构造函数执行顺序
  • 计算机毕业设计 服装生产信息管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • Python的异步编程
  • 【漏洞复现】金和OA C6 GeneralXmlhttpPage.aspx Sql注入漏洞
  • ARM Process state -- PSTATE
  • ubuntu卸载VSFTPD
  • IDEA使用技巧
  • 学习经验分享【38】YOLOv11解读——最新YOLO版本
  • 第十讲-显示控件QLabel
  • 【艾思科蓝】Vue.js组件开发实战:从零构建高效可复用组件
  • PasteForm最佳CRUD实践,实际案例PasteTemplate详解之3000问(三)
  • Qt开发第一讲
  • Unity 2D RPG Kit 学习笔记
  • 深入了解以太坊
  • 【翻译】babel对TC39装饰器草案的实现
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • Angular4 模板式表单用法以及验证
  • iOS 系统授权开发
  • Linux各目录及每个目录的详细介绍
  • Python连接Oracle
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • 关于for循环的简单归纳
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 微信小程序实战练习(仿五洲到家微信版)
  • 因为阿里,他们成了“杭漂”
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 说说我为什么看好Spring Cloud Alibaba
  • #include<初见C语言之指针(5)>
  • $jQuery 重写Alert样式方法
  • $nextTick的使用场景介绍
  • (笔记自用)LeetCode:快乐数
  • (二)丶RabbitMQ的六大核心
  • (二十三)Flask之高频面试点
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (南京观海微电子)——示波器使用介绍
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (四)opengl函数加载和错误处理
  • (四)汇编语言——简单程序
  • (原创)可支持最大高度的NestedScrollView
  • .gitignore文件忽略的内容不生效问题解决
  • .naturalWidth 和naturalHeight属性,
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net core 6 集成和使用 mongodb
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET编程——利用C#调用海康机器人工业相机SDK实现回调取图与软触发取图【含免费源码】
  • .NET和.COM和.CN域名区别
  • /var/lib/dpkg/lock 锁定问题
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [AIGC] Java List接口详解
  • [ASP.NET 控件实作 Day7] 设定工具箱的控件图标
  • [C++]打开新世界的大门之C++入门