导读:本期聚焦于小伙伴创作的《SQL如何实现按月统计数据量?利用日期格式化函数进行GROUP BY的方法》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《SQL如何实现按月统计数据量?利用日期格式化函数进行GROUP BY的方法》有用,将其分享出去将是对创作者最好的鼓励。

在业务数据分析场景中,按月统计数据量是非常常见的需求,比如统计每个月的订单总数、用户新增数量等。要实现这个需求,核心思路是先通过日期格式化函数将日期字段转换为年月的格式,再使用GROUP BY对格式化后的年月进行分组,最后配合聚合函数统计数量。

SQL如何实现按月统计数据量?利用日期格式化函数进行GROUP BY的方法

不同数据库的日期格式化函数差异

不同数据库提供的日期格式化函数语法不同,下面分别介绍主流数据库的实现方式。

MySQL数据库实现

MySQL中使用DATE_FORMAT函数对日期进行格式化,其中%Y代表四位年份,%m代表两位月份,组合后可以得到YYYY-MM格式的年月字符串。

-- 统计orders表每个月的订单数量,假设order_date是日期类型的订单时间字段
SELECT
    DATE_FORMAT(order_date, '%Y-%m') AS stat_month,
    COUNT(*) AS order_count
FROM orders
GROUP BY stat_month
ORDER BY stat_month;

PostgreSQL数据库实现

PostgreSQL中使用TO_CHAR函数进行日期格式化,格式化参数和MySQL类似,YYYY代表四位年份,MM代表两位月份。

-- 统计user表每个月的用户注册量,假设register_time是注册时间字段
SELECT
    TO_CHAR(register_time, 'YYYY-MM') AS stat_month,
    COUNT(*) AS user_count
FROM user
GROUP BY stat_month
ORDER BY stat_month;

SQL Server数据库实现

SQL Server可以使用FORMAT函数或者CONVERT函数实现日期格式化,FORMAT函数的语法更直观,兼容性稍差,CONVERT函数兼容性更好。

-- 使用FORMAT函数统计每月销售额,假设sale_time是销售时间,amount是销售额
SELECT
    FORMAT(sale_time, 'yyyy-MM') AS stat_month,
    SUM(amount) AS total_amount
FROM sale_record
GROUP BY FORMAT(sale_time, 'yyyy-MM')
ORDER BY stat_month;

-- 使用CONVERT函数实现同样效果
SELECT
    CONVERT(VARCHAR(7), sale_time, 23) AS stat_month,
    SUM(amount) AS total_amount
FROM sale_record
GROUP BY CONVERT(VARCHAR(7), sale_time, 23)
ORDER BY stat_month;

常见扩展场景处理

分组后按月份排序

默认GROUP BY后的结果顺序不固定,如果需要按月份升序排列,只需要在查询末尾添加ORDER BY 格式化后的年月字段即可,如上面示例中的ORDER BY stat_month

补全没有数据的月份

如果某个月没有对应数据,上面的查询不会返回该月份的结果,如果需要补全所有月份,需要先生成连续的月份序列,再左连接统计结果。下面是一个MySQL的实现示例:

-- 生成最近12个月的月份序列,左连接订单统计结果,没有数据的月份显示0
WITH month_series AS (
    SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL n MONTH), '%Y-%m') AS stat_month
    FROM (
        SELECT 0 AS n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5
        UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11
    ) t
)
SELECT
    ms.stat_month,
    COALESCE(o.order_count, 0) AS order_count
FROM month_series ms
LEFT JOIN (
    SELECT
        DATE_FORMAT(order_date, '%Y-%m') AS stat_month,
        COUNT(*) AS order_count
    FROM orders
    GROUP BY stat_month
) o ON ms.stat_month = o.stat_month
ORDER BY ms.stat_month;

注意事项

  • 日期字段如果不是日期类型,需要先使用对应数据库的日期转换函数转为日期类型再格式化,比如MySQL的STR_TO_DATE,PostgreSQL的TO_DATE
  • GROUP BY子句中可以直接使用格式化后的表达式,也可以使用别名,不同数据库对别名的支持有差异,建议使用表达式保证兼容性。
  • 如果统计的日期范围很大,建议先通过WHERE条件过滤日期范围,减少数据扫描量,提升查询性能。

SQL日期格式化GROUP_BY按月统计修改时间:2026-06-28 20:54:15

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。