判断一个时间段是否经过了另一个时间段
场景:
IOT设备存在离线与恢复时间记录,每一次离线和恢复记为一个周期即一条数据, 现在需要统计出在某个时段存在离线记录的数据,如果目前未恢复,没有恢复时间,恢复时间置为9999-01-01 00:00:00
原始数据如下(t_offline_record):
id | device_id | offline_time | recover_time |
---|---|---|---|
1 | device_1 | 2022-10-10 10:00:00 | 2022-10-10 20:00:00 |
2 | device_1 | 2022-10-11 00:00:00 | 9999-01-01 00:00:00 |
需求一:
查询出某个时段存在离线的记录(注意不能只用offline_time来做判断,因为就id=1的数据而言,离线时间到恢复时间之间的时间段都属于离线阶段)。如查询2022-10-10 15:00:00 - 2022-10-10 23:00:00 之间存在离线的记录,需要命中id=1的数据
方法:可以参考拉链表查询方式,即:
select * from t_offline_record where recover_time >= '2022-10-10 15:00:00' and offline_time <= '2022-10-10 23:00:00'
能够查询出经过了一个时间段的所有离线数据,开始时间与恢复时间比较,离线时间与截止时间比较
需求二:
希望在上面查询出的离线记录中,只保留上班时段的离线记录,如早上8点到晚上20点区间内有离线的数据。
因为小时段存在跨天的情况,所以并不能单纯使用拉链表查询逻辑,但在同一天内是可以的,因此将它分为三个逻辑:
- 离线和恢复时间为同一天 - 一天内使用拉链表查询方式,没有跨天影响
- 离线和恢复时间差超过24小时 - 超过24小时的不管哪个时段肯定都经历过了
- 离线和恢复时间相差一天 - 即是离线时间在前一天,恢复时间在后一天,因此离线时间与恢复时间任意一个在8-20点之间就算命中
select * from t_offline_record where recover_time >= '2022-10-10 15:00:00' and offline_time <= '2022-10-10 23:00:00'
and (#同一天(TO_DAYS(offline_time)=TO_DAYS(recover_time)andhour(recover_time)>=8 and hour(offline_time)<=20)or#超过24小时(TIMESTAMPDIFF(HOUR, offline_time, recover_time)>=24)or #相差一天(TO_DAYS(offline_time) != TO_DAYS(recover_time)andTIMESTAMPDIFF(HOUR, offline_time, recover_time)< 24and((hour(offline_time) between 8 and 20)or(hour(recover_time) between 8 and 20)))
)
性能上算是废了,但是函数计算部份可以通过预先计算的形式获得,避免在查询过程中使用函数
例子:
在时间区间2022-10-10 15:00:00 至 2022-10-10 23:00:00之间的上班时段8点-20之间经历过离线的数据
原始数据及使用上面的SQL查询命中如下:
id | device_id | offline_time | recover_time | 查询命中 |
---|---|---|---|---|
1 | device_1 | 2022-10-10 10:00:00 | 2022-10-10 20:00:00 | √ |
2 | device_2 | 2022-10-10 05:00:00 | 2022-10-10 07:00:00 | - |
3 | device_3 | 2022-10-10 10:00:00 | 2022-10-11 07:00:00 | √ |
4 | device_4 | 2022-10-10 10:00:00 | 2022-10-12 07:00:00 | √ |
5 | device_5 | 2022-10-10 21:00:00 | 2022-10-11 07:00:00 | - |
6 | device_6 | 2022-10-10 21:00:00 | 9999-01-01 00:00:00 | √ |
判断一个时间段是否经过了另一个时间段相关推荐
- Python判断两个文件夹中互相不同的文件有哪些、判断一个文件夹相对于另外一个文件夹缺少了哪些文件
Python判断两个文件夹中互相不同的文件有哪些.判断一个文件夹相对于另外一个文件夹缺少了哪些文件 目录 Python判断两个文件夹中互相不同的文件有哪些.判断一个文件夹相对于另外一个文件夹缺少了哪些 ...
- Java:判断一个字符串中是否存在另一个字符子串以及判断一个字符串中是否存在指定字符
Java:判断一个字符串中包含指定字符子串,判断一个字符串中存在指定字符 字符串的contains方法可以判断一个字符串中是否存在另一个字符子串,示例如下 String Str = "Hel ...
- 如何判断添加的一个面要素是否与某一个面图层相交(AO)
最近几天开始学习和基础ArcGIS AO 开发,感觉对一些概念性的东西很不了解,在学习过程中遇到了一些问题.突然想起前几天一同学问了我这样一个问题,如何实现添加一个面要素是判断是否与一个面图层相交.开 ...
- Java黑皮书课后题第3章:3.26(使用操作符 ||和^)编写一个程序,提示用户输入一个整数值,然后判断它能否被5和6整除、能否被5或6整除、以及能否被5或6整除但不能被同时整除
3.26(使用操作符&& ||和^)编写一个程序,提示用户输入一个整数值,然后判断它能否被5和6整除.能否被5或6整除.以及能否被5或6整除但不能被同时整除 题目 题目概述 运行示例 ...
- 编写一个函数,该函数能判断一个英文句子str(带空格)中是否含有某个单词w,如“How old are you?”含有“old”。在main函数中输入一个英文句子,再输入一个单词,如果英文句子中含有那
题目要求: 编写一个C程序,实现以下功能: 编写一个函数,该函数能判断一个英文句子str(带空格(升级版))中是否含有某个单词w,如"How old are you?"含有&quo ...
- 如何判断当前循环的栏目是不是最后一个
如何判断当前循环的栏目是不是最后一个 href="[field:typelink> 在实际的开发中,使用channel显示顶级栏目的时候可能会遇到这样的情况,第一个栏目和最后一个栏目的 ...
- 单个form表单内,不同情况显示的不同选项的单选框或多选框的情况下,判断单选框是否存在未选择一个选项情况,并进行提示。
单个form表单内,根据不同条件情况显示的不同选项的单选框,判断单选框是否存在未选择一个选项情况,并进行提示. 开始: 开始时候,直接把所有情况下的单选框选项 用if(!(选项1 已选)&&a ...
- 判断三个参数是否能构成一个三角形
课堂练习1: 写一个方法void triangle(int a,int b,int c),判断三个参数是否能构成一个三角形.如果不能则抛出异常IllegalArgumentException,显示异常 ...
- 12.15有一种数叫回文数,正读和反读都一样,如12321便是一个回文数。编写一个程序,从命令行得到一个整数,判断该数是不是回文数
有一种数叫回文数,正读和反读都一样,如12321便是一个回文数.编写一个程序,从命令行得到一个整数,判断该数是不是回文数 package Text6;import java.util.Scanner; ...
- 有一种数叫回文数,正读和反读都一样,如12321便是一个回文数。编写一个程序,从命令行得到一个整数,判断该数是不是回文数。
package task08;import java.util.Scanner;/** 8.有一种数叫回文数,正读和反读都一样,如12321便是一个回文数.* 编写一个程序,从命令行得到一个整数,判断 ...
最新文章
- 发布一个验证码生成组件
- 基于Log4net插件
- PHP全栈开发(八):CSS Ⅸ dispaly visibility
- 面试关于ISO七层模型你应该知道的东西
- AIR工程中发生This application cannot be run. (Error: invalid application identifier) 错误
- OpenCV学习笔记——判断两张图的相似度
- ciclop读音,购机必备,15种 3D扫描 设备 优缺点汇总
- 牛客挑战赛30 C 小G砍树 换根dp+组合
- html如何让框架的边框消失,css如何让边框透明?
- BP神经网络识别手写数字项目解析及matlab实现
- model类中enum类型与数据库字段的映射
- android 自定义课程表,Android课程表界面布局实现代码
- 推荐一款好用的截图软件Faststone capture
- oc基础 不可变字符串的创建和使用
- 转载js实现打印功能
- 微信小程序开发测试appId如何改为真正的appid
- 【python 去除文件名后缀或提取后缀】
- Windows 10 系统精简方案参考
- MarkText下载安装与初始设置 免费markdown的工具
- GBase 8s灾备集群HAC (三) 主备配置
热门文章
- copy(copy)
- 百度地图数字底座技术专场沙龙预告
- 实验室管理系统 可行性分析
- 把时间沉淀到自己的热爱里 | Kagol 的 2022 年终总结
- Symentec赛门铁克企业型SSL证书好不好
- Comparable Comparator
- 蕴含连接词的真值表为什么这样定义?
- 大学生计算机学习计划2000字,2020学年大学生新学期学习计划2000字
- 详解温度传感器DS18B20编程与使用
- html电话号码表单验证,表单验证电话号码模式html5(Form Validation phone number pattern html5)...