判断一个时间段是否经过了另一个时间段
创始人
2024-02-15 23:13:43
0

场景:

IOT设备存在离线与恢复时间记录,每一次离线和恢复记为一个周期即一条数据, 现在需要统计出在某个时段存在离线记录的数据,如果目前未恢复,没有恢复时间,恢复时间置为9999-01-01 00:00:00

原始数据如下(t_offline_record):
iddevice_idoffline_timerecover_time
1device_12022-10-10 10:00:002022-10-10 20:00:00
2device_12022-10-11 00:00:009999-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点区间内有离线的数据。
因为小时段存在跨天的情况,所以并不能单纯使用拉链表查询逻辑,但在同一天内是可以的,因此将它分为三个逻辑:

  1. 离线和恢复时间为同一天 - 一天内使用拉链表查询方式,没有跨天影响
  2. 离线和恢复时间差超过24小时 - 超过24小时的不管哪个时段肯定都经历过了
  3. 离线和恢复时间相差一天 - 即是离线时间在前一天,恢复时间在后一天,因此离线时间与恢复时间任意一个在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查询命中如下:

iddevice_idoffline_timerecover_time查询命中
1device_12022-10-10 10:00:002022-10-10 20:00:00
2device_22022-10-10 05:00:002022-10-10 07:00:00-
3device_32022-10-10 10:00:002022-10-11 07:00:00
4device_42022-10-10 10:00:002022-10-12 07:00:00
5device_52022-10-10 21:00:002022-10-11 07:00:00-
6device_62022-10-10 21:00:009999-01-01 00:00:00

相关内容

热门资讯

因违反医疗法规,淄博高新区四季... 近日,淄博高新技术产业开发区管理委员会发布一则行政处罚决定书,淄博高新区四季青医院有限公司因违反《医...
宋城演艺:境外投资者通过合规渠... 证券之星消息,宋城演艺(300144)12月22日在投资者关系平台上答复投资者关心的问题。 投资者提...
漯河:公积金政策已做调整! 12月23日,漯河市住房公积金管理中心发布《关于住房公积金缴存基数调整工作的提醒》。我市住房公积金缴...
陕国投A:增发定价符合法规及国... 证券之星消息,陕国投A(000563)12月22日在投资者关系平台上答复投资者关心的问题。 投资者提...
公共利益保护实录:7个行政公益... 从农用地保护到抗战文物抢救,从处方药安全到妇女平等就业——行政公益诉讼如何以司法之力守护公共利益?2...
百亿富豪涉嫌犯罪!上海知名乐园... 12月22日晚,海昌海洋公园发布公告称,海昌海洋公园收到公司董事会主席、执行董事兼行政总裁俞发祥家属...
格陵兰岛总理:格陵兰岛领土完整... 当地时间12月23日,格陵兰岛自治政府总理尼尔森再次重申,格陵兰岛的领土完整和法律地位根植于国际法,...
被起诉的AI独角兽,这样回应好... AIX财经(AIXcaijing)原创 作者 | 陈丹 编辑 | 魏佳 AI与版权的战争,或许正迎来...
桃源法院:车祸背后的温情调解 ... “法官,我知道是我撞了人,可我刚毕业实在没能力赔这么多……”在桃源县人民法院的审判庭内,外卖员琚某的...
江西上高:高效调解有温度 倾力... 近年来,江西省宜春市上高县市场监督管理局始终以“维护消费合法权益,共筑满意消费环境”为目标,持续完善...