MySQL按 年 月 周 日统计表中的数据

本文详细介绍如何使用MySQL的日期函数如YEAR、QUARTER、MONTH、WEEK和DATE_FORMAT,对温湿度采集数据按年、季度、月、周、日进行统计。通过具体SQL语句示例,展示如何计算日期并进行分组统计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在做统计报表的时候,需要对表数据按年、月、周和日分别进行统计。统计用到了MySQL日期函数DATE_FORMAT、YEAR、QUARTER、MONTH和WEEK,本文就这些函数的使用和功能实现进行简单记录,以备后续使用参考。

    准备工作

        本文使用的表结构(温湿度采集表):

CREATE TABLE `tn_data` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `temperature` float DEFAULT '0' COMMENT '温度',
  `humidity` float DEFAULT '0' COMMENT '湿度',
  `updatetime` datetime DEFAULT NULL COMMENT '采集时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1824 DEFAULT CHARSET=utf8mb4

        要实现统计功能:

            按年、季度、月、周、日统计采集的数据量   

    一、按年统计

        实现的原理是,使用日期函数 YEAR(),计算每个日期的年,然后使用 GROUP BY 统计最终的结果,sql 语句如下(注意日期的计算):        

SELECT 
    CONCAT(YEAR (updatetime),'年') dt,
    COUNT(1) AS num 
FROM tn_data 
GROUP BY dt ORDER BY YEAR(updatetime)

        执行以上 sql 代码,结果如下:        

dt          num  
-------  --------
2020年          26

    二、按季度统计

        实现的原理是,使用日期函数 QUARTER(),计算每个日期所在的季度,然后使用 GROUP BY 统计最终的结果,sql 语句如下(注意日期的计算):        

SELECT 
    CONCAT(YEAR (updatetime),'年',QUARTER (updatetime),'季度') dt,
    COUNT(1) AS num 
FROM tn_data 
GROUP BY dt ORDER BY QUARTER(updatetime)

        执行以上 sql 代码,结果如下:        

dt                 num  
--------------  --------
2020年1季度               9
2020年2季度              17

    三、按月统计

        实现的原理是,使用日期函数 MONTH(),计算每个日期所在的月份,然后使用 GROUP BY 统计最终的结果,sql 语句如下(注意日期的计算):        

SELECT 
    CONCAT(YEAR (updatetime),'年',MONTH(updatetime),'月') dt,
    COUNT(1) AS num 
FROM tn_data 
GROUP BY dt ORDER BY MONTH(updatetime)

        执行以上 sql 代码,结果如下:        

dt              num  
-----------  --------
2020年1月             2
2020年2月             3
2020年3月             4
2020年4月             4
2020年5月             4
2020年6月             9

    四、按周统计

        实现的原理是,使用日期函数 WEEK(),计算每个日期所在的周,然后使用 GROUP BY 统计最终的结果,sql 语句如下(注意日期的计算):        

SELECT 
    CONCAT(YEAR (updatetime),'年',WEEK(updatetime),'周') dt,
    COUNT(1) AS num 
FROM tn_data 
GROUP BY dt ORDER BY WEEK(updatetime)

        执行以上 sql 代码,结果如下:        

dt               num  
------------  --------
2020年0周              2
2020年4周              3
2020年9周              4
2020年13周             4
2020年21周             4
2020年22周             9

    五、按日统计

        实现的原理是,使用日期函数 DATE_FORMAT(),计算每个日期,然后使用 GROUP BY 统计最终的结果,sql 语句如下(注意日期的计算):        

SELECT 
    DATE_FORMAT(updatetime, '%Y-%m-%d') dt,
    COUNT(1) AS num 
FROM tn_data 
GROUP BY dt ORDER BY dt

        执行以上 sql 代码,结果如下:        

dt             num  
----------  --------
2020-01-01         2
2020-02-01         3
2020-03-01         4
2020-04-01         4
2020-05-29         4
2020-06-01         9

     通过上面的简单介绍,可以看出,实现按年、季度、月、周、日统计数据量,主要是使用相应的MySQL函数,计算出正确的日期,然后对数据进行统计。

好的,您的问题是如何查询某个内按自然分组,但是即使该没有数据,也要显示该数据。我可以给您提供一个思路,您可以根据您的具体需求进行调整。首先,我们可以使用 MySQL 中的期函数 `DATE_FORMAT()` 将期格式化为指定的字符串格式,以便进行分组。然后,我们可以使用 `LEFT JOIN` 将期范围内的所有自然数据表进行连接,这样即使该没有数据也会显示该数据。以下是示例 SQL 语句: ``` SELECT weeks.week, COUNT(data.id) AS count FROM ( SELECT DATE_FORMAT(date, '%x-%v') AS week FROM ( SELECT DATE_ADD(DATE_FORMAT('2022-06-01', '%Y-%m-01'), INTERVAL (n-1) DAY) AS date FROM ( SELECT n FROM ( SELECT 1 n UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12 UNION SELECT 13 UNION SELECT 14 UNION SELECT 15 UNION SELECT 16 UNION SELECT 17 UNION SELECT 18 UNION SELECT 19 UNION SELECT 20 UNION SELECT 21 UNION SELECT 22 UNION SELECT 23 UNION SELECT 24 UNION SELECT 25 UNION SELECT 26 UNION SELECT 27 UNION SELECT 28 UNION SELECT 29 UNION SELECT 30 UNION SELECT 31 ) n WHERE n <= DAY(LAST_DAY('2022-06-01')) ) days ) weeks ) weeks LEFT JOIN data ON DATE_FORMAT(data.date, '%x-%v') = weeks.week WHERE DATE_FORMAT(data.date, '%Y-%m') = '2022-06' GROUP BY weeks.week ``` 该 SQL 语句中,我们首先生成了一个期范围内的所有自然的列表(即子查询中的 `weeks`),并使用 `LEFT JOIN` 将其与数据表进行连接,然后使用 `COUNT()` 函数统计每个自然数据行数。最后使用 `GROUP BY` 对自然进行分组,并筛选出指定份的数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值