判断时间段是否重叠

1、逻辑公式

时间段1:start1(开始时间),end1(结束时间)

时间段2:start2(开始时间),end2(结束时间)

重叠条件为:start1 <= end2 && end1 >= start2。

2、java实现

工具方法

/*** 判断时间是否重叠* true重叠。false不重叠** @param start1* @param end1* @param start2* @param end2* @param isStrict 是否严格遵守不能重叠,例如如果为true 那么8:00-8:30 和8:30-9:00 时间段比较为true* @methodName: isOverlapLocalTime* @return: boolean* @date: 2023/8/10**/
public static boolean isOverlapLocalTime(LocalTime start1, LocalTime end1, LocalTime start2, LocalTime end2, boolean isStrict) {if (start1.isAfter(end1) || start2.isAfter(end2)) {throw new DateTimeException("endDate不能小于startDate");}if (isStrict) {if (start1.compareTo(end2) <= 0 && end1.compareTo(start2) >= 0) {//重叠return true;}//不重叠return false;}if (start1.compareTo(end2) < 0 && end1.compareTo(start2) > 0) {//重叠return true;}//不重叠return false;
}

测试

/*** 判断时间是否重叠** @methodName: isOverlap* @return: void* @date: 2023/8/10**/
@Test
void isOverlapLocalTime() {LocalTime start1 = LocalTime.now();LocalTime end1 = start1.plusHours(2);LocalTime start2 = start1.plusHours(2);LocalTime end2 = start1.plusHours(5);log.info("start1:{},end1:{},start2:{},end2:{}", start1, end1, start2, end2);log.info("isOverlap:{}", DateUtils.isOverlapLocalTime(start1, end1, start2, end2, true));
}

返回结果:true

3、数据库实现

同表sql使用公共方式

SELECT * 
FROM table_name t1, table_name t2 
WHERE t1.id <> t2.id 
AND t1.start_time <= t2.end_time AND t1.end_time >= t2.start_time;

t1.id <> t2.id 用于排除同一行数据的比较。这个语句会将表中的每一行数据与其他行数据进行比较,如果存在重叠的时间段,则返回结果集。

建表

CREATE TABLE `test_date`  (`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,`start_time` datetime NOT NULL,`end_time` datetime NOT NULL,PRIMARY KEY (`id`) USING BTREE,INDEX `idx_start_time`(`start_time` ASC) USING BTREE,INDEX `idx_end_time`(`end_time` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

添加数据

INSERT INTO `test_date` VALUES (1, '2021-08-05 11:19:01', '2021-08-31 11:19:01');
INSERT INTO `test_date` VALUES (2, '2010-08-27 18:56:13', '2010-09-05 18:56:13');
INSERT INTO `test_date` VALUES (3, '2015-08-08 07:31:37', '2015-09-30 07:31:37');
INSERT INTO `test_date` VALUES (4, '2012-07-16 07:11:41', '2012-07-31 07:11:41');
INSERT INTO `test_date` VALUES (5, '2001-08-21 09:23:11', '2006-11-05 05:28:14');
INSERT INTO `test_date` VALUES (6, '2001-06-07 10:50:32', '2007-12-22 12:45:20');
INSERT INTO `test_date` VALUES (7, '2019-03-29 20:55:14', '2019-04-30 20:55:14');
INSERT INTO `test_date` VALUES (8, '2010-10-21 10:10:27', '2014-07-10 13:18:35');
INSERT INTO `test_date` VALUES (9, '2008-08-12 03:39:36', '2015-09-05 20:17:57');
INSERT INTO `test_date` VALUES (10, '2020-03-24 00:39:22', '2023-10-21 17:26:11');

测试

sql语句:id!=10为排除同一行数据

SELECT* 
FROMtest_date 
WHEREid != 10 AND start_time <= "2023-10-21 17:26:11" AND end_time >= '2020-03-24 00:39:22';

结果如下,存在1条重叠数据

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/61659.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

易服客工作室:7个优质WordPress LMS线上教育系统插件比较(优点和缺点)

您是否正在为您的 WordPress 网站寻找最好的 LMS 插件&#xff1f;在线学习管理系统 (LMS) 插件允许您使用 WordPress 创建和运行类似 Udemy 的在线课程。 一个完美的 WordPress LMS 插件包括管理在线课程内容、处理订阅、运行和评分测验、接受付款等功能。 在本文中&#xf…

树结构--介绍--二叉树遍历的递归实现

目录 树 树的学术名词 树的种类 二叉树的遍历 算法实现 遍历命名 二叉树的中序遍历 二叉树的后序遍历 二叉树的后序遍历迭代算法 二叉树的前序遍历 二叉树的前序遍历迭代算法 树 树是一种非线性的数据结构&#xff0c;它是由n(n≥0)个有限节点组成一个具有层次关系…

iOS 实现图片高斯模糊效果

效果图 用到了 UIVisualEffectView 实现代码 - (UIVisualEffectView *)bgEffectView{if(!_bgEffectView){UIBlurEffect *blur [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];_bgEffectView [[UIVisualEffectView alloc] initWithEffect:blur];}return _bgEffect…

Spring Data JPA 详解

目录 一、概述1.1 JPA简介1.2 Spring Data JPA简介 二、配置及应用2.1 环境配置2.2 依赖添加2.3 实体类创建2.4 Repository接口创建2.5 示例程序运行 三、实体映射3.1 注解3.2 关系映射 四、Repository接口4.1 基本增删改查4.2 自定义查询方法4.3 使用 Sort 和 Pageable 进行排…

【236. 二叉树的最近公共祖先】

目录 1.题目描述2.算法思路2.1算法思路12.2算法思路2 3.代码实现3.1代码实现13.2 代码实现2 1.题目描述 2.算法思路 2.1算法思路1 2.2算法思路2 思想很简单&#xff0c;但是最难的是怎么用栈来记录q、p的路线。所以下面才是关键。 3.代码实现 3.1代码实现1 class Solution…

Codeforces Round 890 (Div. 2) D. More Wrong(交互题 贪心/启发式 补写法)

题目 t(t<100)组样例&#xff0c;长为n(n<2000)的序列 交互题&#xff0c;每次你可以询问一个区间[l,r]的逆序对数&#xff0c;代价是 要在的代价内问出最大元素的位置&#xff0c;输出其位置 思路来源 neal Codeforces Round 890 (Div. 2) supported by Constructo…

API 测试 | 了解 API 接口概念|电商平台 API 接口测试指南

什么是 API&#xff1f; API 是一个缩写&#xff0c;它代表了一个 pplication P AGC 软件覆盖整个房间。API 是用于构建软件应用程序的一组例程&#xff0c;协议和工具。API 指定一个软件程序应如何与其他软件程序进行交互。 例行程序&#xff1a;执行特定任务的程序。例程也称…

自动方向识别式 LSF型电平转换芯片

大家好&#xff0c;这里是大话硬件。 今天这篇文章想分享一下电平转换芯片相关的内容。 其实在之前的文章分享过一篇关于电平转换芯片的相关内容&#xff0c;具体可以看链接《高速电路逻辑电平转换设计》。当时这篇文章也是分析的电平转换芯片&#xff0c;不过那时候更多的是…

[保研/考研机试] KY235 进制转换2 清华大学复试上机题 C++实现

题目链接&#xff1a; KY235 进制转换2 https://www.nowcoder.com/questionTerminal/ae4b3c4a968745618d65b866002bbd32 描述 将M进制的数X转换为N进制的数输出。 输入描述&#xff1a; 输入的第一行包括两个整数&#xff1a;M和N(2<M,N<36)。 下面的一行输入一个数…

当编程遇上AI,纵享丝滑

目录 前言 一、提出需求 二、检查代码 三、进一步提出需求 总结 前言 自从CHATGPT火了以后&#xff0c;我发现我身边的人再也不怕写报告了&#xff0c;什么个人总结&#xff0c;汇报材料&#xff0c;年度总结&#xff0c;伸手就来&#xff08;反正哪些报告也没人看&#x…

Oracle-创建PDB

Oracle-创建PDB 创建PDB的方式 从PDB$SEED新建PDB克隆已存在的PDB 本地PDB克隆到同一个CDB中将远程PDB克隆到CDB中将非CDB插入或克隆到CDB中通过插拔的方式创建PDB sql 命令语法 条件 CDB必须open并且read write模式连接CDB$ROOT 用户并且具有CREATEPLUGGABLEDATABASE系统权…

【C++】set 和 map 简单了解使用

文章目录 关联式容器set 和 multisetmap 和 multimap 关联式容器 set 和 multiset map 和 multimap