MySQL去除重叠时间求时间差和的实现


Posted in MySQL onAugust 23, 2021

         我个人并不推荐在实际开发中使用存储过程,充满了各种的不方便,之所以写这东西,全在于学习,如果有高手看到我的内容有问题,可以随时指出或向我开炮。 

需求:

        在生产中常常出现计算两个时间差的业务,比如总宕机时间、总开通会员时间等等。。。但是这些时间往往不是连贯的,断断续续,甚至可能会出现重叠的情况。无法直接求出时间差。

例如:

MySQL去除重叠时间求时间差和的实现

MySQL去除重叠时间求时间差和的实现

 开车:

        一开始,我想的是用单条SQL实现,例如:↓

SELECT TIMESTAMPDIFF(MINUTE, '2021-08-19 14:30:00', '2021-08-19 15:00:00') FROM DUAL;

 我发现,数据库数据千千万,不可能这样,也不可能用UNION这种东西去拼接,数据很多,就一定会有循环,所以,在不使用Java语言的情况下,我选择尝试用存储过程来解决以下这个问题。

思路:

         首先,一次进入循环的数据不会进行计算,防止后边的数据和它有重叠,

        从第二条数据开始,就要判断开始时间是否和上一个数据重叠,如果重叠,则校验结束时间是否也重叠,如果重叠我就啥也不干,不重叠,则把这个值赋给上一次的数据的结束时间。

        如果开始时间不再范围内,那么需要判断开始时间是在上一次时间的之前还是之后

        如果这个范围之前,把这个值赋给上一次的数据的开始时间。

        在这个范围之后,计算并赋值

        最后一次循环也要计算并赋值

实现:        

首先创建表,模拟数据

CREATE TABLE test01 (
  id int(32) unsigned NOT NULL AUTO_INCREMENT,
  start_time datetime NOT NULL,
  end_time datetime NOT NULL,
  PRIMARY KEY (`id`)
) 
 
INSERT INTO test01(id, start_time, end_time) VALUES (1, '2021-08-18 16:27:51', '2021-08-18 17:27:59');
INSERT INTO test01(id, start_time, end_time) VALUES (2, '2021-08-18 17:20:26', '2021-08-18 20:10:37');
INSERT INTO test01(id, start_time, end_time) VALUES (3, '2021-08-18 22:05:57', '2021-08-18 23:55:20');

 MySQL去除重叠时间求时间差和的实现

 创建存储过程:

CREATE PROCEDURE sumTime()
BEGIN
    -- 定义变量 
 
    -- 是否首次
    DECLARE is_old int(1) DEFAULT 0;
 
    -- 上一次数据
	DECLARE old_start_time datetime;
	DECLARE old_end_time datetime;
 
	-- 本次数据
	DECLARE start_time datetime;
	DECLARE end_time datetime;
 
	-- 返回结果
	DECLARE num int(32) DEFAULT 0;
 
	-- 循环结束开关
	DECLARE done int DEFAULT 0;
 
	-- 创建游标(查询数据库数据)
	DECLARE list CURSOR FOR SELECT a.start_time, a.end_time FROM test01 a;
 
    -- 定义最后一次循环时设置 循环结束开关 为 1
	DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
 
	-- 开启游标
	OPEN list;
 
		-- 开启循环
		posLoop:LOOP
			-- 取值 将当前循环的值取出 赋值给当前数据变量
			FETCH list INTO start_time,end_time;
			-- 判断是否首次
			if (is_old = 0) THEN 
 
				SET is_old = 1;
				SET old_start_time = start_time;
				SET old_end_time = end_time;
 
			-- 否则
			ELSE
				-- 校验是否在区间内
				 if (start_time >= old_start_time AND start_time <= old_end_time) THEN
 
					-- 校验结束时间是否不在在区间内
				   if (end_time < old_start_time OR end_time > old_end_time) THEN
						SET old_end_time = end_time;
				   END IF;
 
				 -- 否则
				 ELSE
 
				   if (start_time < old_start_time )  THEN
 
						SET old_start_time = start_time;
 
					 ELSE
 
						SET num = num + TIMESTAMPDIFF(MINUTE, old_start_time, old_end_time);
						SET old_start_time = start_time;
						SET old_end_time = end_time;
					 END IF;
				 END IF;
			END IF;
			-- 校验是否最后一次循环
			IF done=1 THEN 
			    SET num = num + TIMESTAMPDIFF(MINUTE, old_start_time, old_end_time);
			    LEAVE posLoop;
			END IF;
		-- 结束循环	
		END LOOP posLoop;
	-- 关闭游标 
	CLOSE list;
	SELECT num;
END;
-- 调用存储过程
call sumTime();

 MySQL去除重叠时间求时间差和的实现

-- 删除存储过程
drop procedure if exists sumTime;

到此这篇关于MySQL去除重叠时间求时间差和的实现的文章就介绍到这了,更多相关MySQL 求时间差和内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
mysql批量新增和存储的方法实例
Apr 07 MySQL
MySQL慢查询的坑
Apr 28 MySQL
修改MySQL的数据库引擎为INNODB的方法
May 26 MySQL
正确使用MySQL update语句
May 26 MySQL
MySQL中连接查询和子查询的问题
Sep 04 MySQL
MySQL into_Mysql中replace与replace into用法案例详解
Sep 14 MySQL
MySQL 计算连续登录天数
May 11 MySQL
MySQL GTID复制的具体使用
May 20 MySQL
MySQL自定义函数及触发器
Aug 05 MySQL
mysql序号rownum行号实现方式
Dec 24 MySQL
mysql数据库如何转移到oracle
Dec 24 MySQL
postgresql如何找到表中重复数据的行并删除
May 08 MySQL
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
Aug 23 #MySQL
MySQL的全局锁和表级锁的具体使用
Aug 23 #MySQL
MySQL令人大跌眼镜的隐式转换
Aug 23 #MySQL
SQL IDENTITY_INSERT作用案例详解
Aug 23 #MySQL
MySQL非空约束(not null)案例讲解
Aug 23 #MySQL
MySQL外键约束(FOREIGN KEY)案例讲解
Aug 23 #MySQL
MySQL 1130异常,无法远程登录解决方案详解
Aug 23 #MySQL
You might like
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
2014/05/08 PHP
destoon文章模块调用企业会员资料的方法
2014/08/22 PHP
PHP通过内置函数memory_get_usage()获取内存使用情况
2014/11/20 PHP
PHP文字转图片功能原理与实现方法分析
2017/08/31 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
PHP中迭代器的简单实现及Yii框架中的迭代器实现方法示例
2020/04/26 PHP
jquery jqPlot API 中文使用教程(非常强大的图表工具)
2011/08/15 Javascript
JS中setTimeout()的用法详解
2013/04/14 Javascript
在每个匹配元素的外部插入新元素的方法
2013/12/20 Javascript
jQuery中insertBefore()方法用法实例
2015/01/08 Javascript
JS实现进入页面时渐变背景色的方法
2015/02/25 Javascript
表单元素值获取方式js及java方式的简单实例
2016/10/15 Javascript
js中删除数组中的某一元素实例(无下标时)
2017/02/28 Javascript
javascript实现文字无缝滚动效果
2017/08/26 Javascript
浅谈ajax请求不同页面的微信JSSDK问题
2018/02/26 Javascript
JS实现判断图片是否加载完成的方法分析
2018/07/31 Javascript
vue+axios+element ui 实现全局loading加载示例
2018/09/11 Javascript
nuxt.js中间件实现拦截权限判断的方法
2018/11/21 Javascript
使用react render props实现倒计时的示例代码
2018/12/06 Javascript
加快Vue项目的开发速度的方法
2018/12/12 Javascript
nodejs开发一个最简单的web服务器实例讲解
2020/01/02 NodeJs
javascript设计模式 ? 策略模式原理与用法实例分析
2020/04/21 Javascript
使用beaker让Facebook的Bottle框架支持session功能
2015/04/23 Python
基于Python Shell获取hostname和fqdn释疑
2016/01/25 Python
Python使用arrow库优雅地处理时间数据详解
2017/10/10 Python
浅析python的优势和不足之处
2018/11/20 Python
基于Python的图像数据增强Data Augmentation解析
2019/08/13 Python
Python迭代器模块itertools使用原理解析
2019/12/11 Python
python 实现人和电脑猜拳的示例代码
2020/03/02 Python
Django Serializer HiddenField隐藏字段实例
2020/03/31 Python
Python pathlib模块使用方法及实例解析
2020/10/05 Python
几款主流好用的富文本编辑器(所见即所得常用编辑器)介绍
2021/03/17 Javascript
产品销售计划书
2014/05/04 职场文书
旅游与环境专业求职信
2014/06/05 职场文书
企业党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
导游词之黄帝陵景区
2019/09/16 职场文书