You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 11:32:33