在业务数据统计场景中,按周或季度维度汇总数据是常见需求,不同数据库提供了各自的日期函数,可快速提取对应的时间周期信息,实现分组统计。

MySQL中的实现方法
按周统计
MySQL可以使用WEEK()函数提取日期对应的周数,结合YEAR()函数区分不同年份的同一周,避免跨年统计混淆。
-- 统计每周的订单数量
SELECT
YEAR(order_time) AS order_year,
WEEK(order_time) AS order_week,
COUNT(*) AS order_count
FROM order_table
GROUP BY YEAR(order_time), WEEK(order_time)
ORDER BY order_year, order_week;
按季度统计
使用QUARTER()函数可以直接提取日期对应的季度,结合YEAR()函数实现按年分季度的统计。
-- 统计每季度的销售额
SELECT
YEAR(sale_time) AS sale_year,
QUARTER(sale_time) AS sale_quarter,
SUM(sale_amount) AS total_amount
FROM sale_table
GROUP BY YEAR(sale_time), QUARTER(sale_time)
ORDER BY sale_year, sale_quarter;
PostgreSQL中的实现方法
按周统计
PostgreSQL使用EXTRACT()函数配合WEEK参数提取周数,同样需要结合年份区分跨年周。
-- 统计每周的用户注册量
SELECT
EXTRACT(YEAR FROM reg_time) AS reg_year,
EXTRACT(WEEK FROM reg_time) AS reg_week,
COUNT(*) AS reg_count
FROM user_table
GROUP BY EXTRACT(YEAR FROM reg_time), EXTRACT(WEEK FROM reg_time)
ORDER BY reg_year, reg_week;
按季度统计
提取季度时同样使用EXTRACT()函数,参数为QUARTER即可。
-- 统计每季度的活跃用户数
SELECT
EXTRACT(YEAR FROM active_time) AS active_year,
EXTRACT(QUARTER FROM active_time) AS active_quarter,
COUNT(DISTINCT user_id) AS active_user_count
FROM active_log
GROUP BY EXTRACT(YEAR FROM active_time), EXTRACT(QUARTER FROM active_time)
ORDER BY active_year, active_quarter;
SQL Server中的实现方法
按周统计
SQL Server使用DATEPART()函数,参数设置为WEEK提取周数,搭配YEAR()函数使用。
-- 统计每周的访问量
SELECT
YEAR(visit_time) AS visit_year,
DATEPART(WEEK, visit_time) AS visit_week,
COUNT(*) AS visit_count
FROM visit_log
GROUP BY YEAR(visit_time), DATEPART(WEEK, visit_time)
ORDER BY visit_year, visit_week;
按季度统计
提取季度时DATEPART()函数参数为QUARTER,也可以直接通过月份计算:(MONTH(日期列)-1)/3+1得到季度。
-- 统计每季度的产品销量
SELECT
YEAR(sale_date) AS sale_year,
DATEPART(QUARTER, sale_date) AS sale_quarter,
SUM(sale_num) AS total_sale_num
FROM product_sale
GROUP BY YEAR(sale_date), DATEPART(QUARTER, sale_date)
ORDER BY sale_year, sale_quarter;
注意事项
- 不同数据库的周数起始规则可能存在差异,比如有的以周日为一周起始,有的以周一为起始,需要根据业务需求调整函数参数。
- 跨年统计时务必同时关联年份和周数或者季度,避免不同年份的同一周期被合并统计。
- 如果统计的时间范围包含不完整周或者季度,需要根据业务要求决定是否过滤或单独标记。