如何在MySQL中将年度统计转换为学年(7.1-次年6.30)统计?
MySQL按学年(7月1日至次年6月30日)统计事件/学生数量的实现方法
核心是根据日期所在月份,将其映射到对应的学年周期,以下两种简便写法都可以实现需求:
方法一:通过CASE判断月份(直观易懂)
直接判断日期的月份,确定学年的起始和结束年份,再拼接成XXXX-XX格式的学年标识:
SELECT -- 生成学年标识,例如2022-23、2024-25 CONCAT( CASE WHEN MONTH(startdate) >= 7 THEN YEAR(startdate) ELSE YEAR(startdate) - 1 END, '-', RIGHT(CASE WHEN MONTH(startdate) >= 7 THEN YEAR(startdate) + 1 ELSE YEAR(startdate) END, 2) ) AS school_year, COUNT(*) AS event_count, -- 统计事件数量 COUNT(DISTINCT student_id) AS student_count -- 统计唯一学生数量(假设表中有student_id字段) FROM events GROUP BY school_year ORDER BY school_year;
逻辑说明:
- 若
startdate在7月1日及之后,学年起始年为当前年份,结束年为当前年份+1 - 若
startdate在6月30日及之前,学年起始年为当前年份-1,结束年为当前年份 RIGHT(..., 2)用于提取年份的后两位,生成短格式的后缀
方法二:通过日期偏移简化计算(更简洁)
将日期往前偏移6个月,此时原7月的日期会落到当年1月,原6月的日期会落到前一年12月,直接取偏移后的年份作为学年起始年,再拼接结束年后缀:
SELECT CONCAT( YEAR(DATE_ADD(startdate, INTERVAL -6 MONTH)), '-', RIGHT(YEAR(DATE_ADD(startdate, INTERVAL -6 MONTH)) + 1, 2) ) AS school_year, COUNT(*) AS event_count, COUNT(DISTINCT student_id) AS student_count FROM events GROUP BY school_year ORDER BY school_year;
逻辑说明:
- 偏移6个月后,所有属于同一学年的日期会被映射到同一个自然年,直接用
YEAR()提取即可得到学年起始年 - 这种写法避免了CASE判断,代码更简洁,适合对日期逻辑熟悉的场景
内容的提问来源于stack exchange,提问作者OZ1SEJ
相关产品推荐
相关产品推荐

