• 在MySQL上实现间隔5分钟汇总取数及相关字符串、时间处理方法实践


    1. 实践案例需求描述

    查询mysql数据库,按每5分钟分组获取3个小时内的电量数据,参考SQL语句如下。

    select sd.RecordTime RecordTime, sd.sddl sddl,sd.pvdl ,cap.capdl capdl from
    ((SELECT CONCAT(DATE_FORMAT(RecordTime,'%Y-%m-%d %H:'), LPAD(floor(MINUTE(RecordTime)/5)*5,2,'0')) RecordTime,
    sum(case when EquipmentId='db_sddb1' then ThisPower else 0 end) sddl, 
    sum(case when EquipmentId='db_syfd1' then ThisPower else 0 end) pvdl
    FROM electricitymeter_history
    where RecordTime > date_sub(str_to_date('2023-11-06 00', '%Y-%m-%d %H'), interval 3 hour)
    group by CONCAT(DATE_FORMAT(RecordTime,'%Y-%m-%d %H:'),  LPAD(floor(MINUTE(RecordTime)/5)*5,2,'0'))) sd
    left join
    (SELECT CONCAT(DATE_FORMAT(RecordTime,'%Y-%m-%d %H:'), LPAD(floor(MINUTE(RecordTime)/5)*5,2,'0')) RecordTime,sum(ThisChargingCapacity) capdl
    FROM storedenergy_history
    WHERE 
    RecordTime > date_sub(str_to_date('2023-11-06 00', '%Y-%m-%d %H'), interval 3 hour)
    group by CONCAT(DATE_FORMAT(RecordTime,'%Y-%m-%d %H:'),  LPAD(floor(MINUTE(RecordTime)/5)*5,2,'0'))) cap
    on sd.RecordTime = cap.RecordTime )
    order by RecordTime desc
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    其中,5分钟间隔是这样约束的:

    时间01:30:00至01:34:59的数据进行合计,时间计为01:30,时间01:35:00至01:39:59的数据进行合计,时间计计为01:35。

    2. 解决方法

    2.1. 间隔5分钟算法

    时间 = 向下取整 ( 分钟数 5 ) × 5 时间 = 向下取整( \frac{分钟数}{5} )\times5 时间=向下取整(5分钟数)×5

    select floor(MINUTE(now())/5)*5
    
    • 1

    2.2. 分类转数据列

    使用case when,符合条件的取出值,不满足赋值0,例如:

    sum(case when EquipmentId='db_sddb1' then ThisPower else 0 end) sddl, 
    sum(case when EquipmentId='db_syfd1' then ThisPower else 0 end) pvdl
    
    • 1
    • 2

    3. 主要相关mysql技术

    3.1. 取整

    1. 向下取整(Floor):

    使用Floor函数可以将一个数值向下取整为最接近的小于或等于该数值的整数。例如,Floor(3.8)的结果为3。

    1. 向上取整(Ceiling):

    使用Ceiling函数可以将一个数值向上取整为最接近的大于或等于该数值的整数。例如,Ceiling(3.2)的结果为4。

    1. 四舍五入(Round):

    使用Round函数可以将一个数值按照四舍五入的规则取整。例如,Round(3.5)的结果为4,Round(3.4)的结果为3。

    1. 截断取整(Truncate):

    使用Truncate函数可以将一个数值截断为指定小数位数的整数。例如,Truncate(3.567, 2)的结果为3.56,表示将3.567截断为两位小数。

    1. 向零取整(Trunc):

    使用Trunc函数可以将一个数值向零取整,即直接去掉小数部分。例如,Trunc(3.8)的结果为3,Trunc(-3.8)的结果为-3。

    除了以上几种常用的取整方法外,MySQL还提供了其他一些函数来满足不同的需求,如Ceil函数用于向上取整,Div函数用于整除运算并返回整数部分,Mod函数用于取模运算并返回余数等。

    3.2. 字符串补位

    在 MySQL 数据库中,字符串补全位数是一种非常常见的操作。这个操作可以让你的数据更加规范化,也可以让你的代码更加清晰易懂。在本文中,我们将会介绍 MySQL 字符串补全位数的方法与技巧。

    1. 使用 LPAD() 函数

    LPAD() 函数是 MySQL 中用来补全字符串的函数。

    是最终字符串的长度,pad 是用来补全的字符。例如,可以使用如下的 SQL 语句:

    SELECT LPAD('123',5,'0');
    
    • 1

    这个语句会返回 ‘00123’。LPAD() 函数会在字符串的左侧使用指定的字符进行补全。

    1. 使用 RPAD() 函数

    除了 LPAD() 函数之外,MySQL 还提供了 RPAD() 函数。这个函数的作用和 LPAD() 函数类似,不同之处在于它是在字符串的右侧进行补全。例如,可以使用如下的 SQL 语句:

    SELECT RPAD('123',5,'0');
    
    • 1

    3.3. 区分字符大小写

    在mysql中,可以利用select查询语句配合binary关键字来区分大小写,select语句用于查询数据,binary关键字用于区分大小写,语法为“select * from 表名 WHERE binary 字段=字段值”。

    SELECT * FROM electricitymeter_history where binary EquipmentId = 'db1';
    
    • 1

    3.4. 设置时间间隔

    例如取三小时之前的时间:

    select date_sub(now(), interval 3 hour)
    
    • 1

    其中的 interval 是一个时间间隔函数,用于在日期和时间上进行加减计算。它非常适合用于处理时间序列数据、执行标志和报告日期等操作。INTERVAL 可以接受的时间单位包括年(YEAR)、季度(QUARTER)、月(MONTH)、周(WEEK)、天(DAY)、时(HOUR)、分(MINUTE)、秒(SECOND)。

    interval 函数的语法:

    DATE_ADD(date, INTERVAL expr unit)
    DATE_SUB(date, INTERVAL expr unit)
    
    • 1
    • 2
  • 相关阅读:
    深度详解 Android R(11.0)Service 启动过程
    redis的bitmap数据类型使用(亿级海量数据统计解决方案)
    uniapp:动态修改页面标题
    MySql学习笔记01——SQL的相关术语
    高性能分布式对象存储——MinIO实战操作(MinIO扩容)
    java基础学习:序列化之 - ObjectMapper
    STM32笔记—EXTI外部中断
    js中数组的方法
    css flex 踩坑总结
    早安心语早读:愿我们都能活成自己喜欢的样子
  • 原文地址:https://blog.csdn.net/xiaoyw/article/details/134395738