postgresql/mysql 8.0+用extract(quarter from date),mysql 5.7用quarter(),sql server用datepart(quarter, date),sqlite需手动计算;季度值为整数1–4,group by须重复表达式,跨年汇总勿漏年份字段。

用 EXTRACT 或 DATE_PART 提取季度(PostgreSQL / MySQL 8.0+)
大多数现代数据库支持直接从日期中提取季度,但函数名和语法略有差异。PostgreSQL 用 EXTRACT(QUARTER FROM order_date),MySQL 8.0+ 同样支持 EXTRACT(QUARTER FROM order_date),而旧版 MySQL 得靠 QUARTER(order_date)。
注意:季度值是数字(1–4),不是字符串,所以分组时别加引号;另外,EXTRACT 返回的是 INTEGER,可直接用于 ORDER BY 排序。
- PostgreSQL 示例:
SELECT EXTRACT(YEAR FROM order_date) AS year, EXTRACT(QUARTER FROM order_date) AS quarter, SUM(amount) FROM sales GROUP BY year, quarter ORDER BY year, quarter; - MySQL 5.7 请改用:
SELECT YEAR(order_date) AS year, QUARTER(order_date) AS quarter, SUM(amount) FROM sales GROUP BY year, quarter; - 如果只按季度不关心年份,漏掉
YEAR()会导致跨年数据混在一起——这是最常踩的坑
SQL Server 用 DATEPART,别写成 DATEPART(q, ...)
SQL Server 不支持 QUARTER 这种简写,必须用 DATEPART(quarter, order_date),且第一个参数是完整单词 quarter,不是 q——写错会报错 Argument data type q is invalid for argument 1 of datepart function.
- 正确写法:
SELECT YEAR(order_date) AS year, DATEPART(quarter, order_date) AS quarter, SUM(amount) FROM sales GROUP BY YEAR(order_date), DATEPART(quarter, order_date); -
DATEPART返回的是整数,但要注意:它不自动补零,季度 1 就是 1,不是 "Q1";如需格式化成 "2023-Q2",得用CONCAT(YEAR(...), '-Q', DATEPART(...)) - 在
GROUP BY中重复写DATEPART(quarter, order_date)是必须的,不能只写别名quarter(除非用子查询或 CTE)
SQLite 没有原生季度函数,得手动算
SQLite 连 QUARTER() 都没有,只能靠 strftime('%m', order_date) 取月份,再用整除或 CASE 判断。比如月份 1–3 算 Q1,4–6 算 Q2……
- 推荐写法:
SELECT strftime('%Y', order_date) AS year, (CAST(strftime('%m', order_date) AS INTEGER) + 2) / 3 AS quarter, SUM(amount) FROM sales GROUP BY year, quarter;(利用整数除法:1→1, 4→2, 7→3, 10→4) - 别用字符串拼接判断,比如
strftime('%m', ...) IN ('01','02','03'),既啰嗦又难维护 -
strftime('%m')返回的是字符串,必须转成整数才能计算,否则'03' + 2会出错或隐式转成 0
按自然季度汇总时,时间范围边界容易错
季度汇总默认按日历季度(Jan–Mar 是 Q1),但如果业务要求按财年(比如 4月–6月为Q1),就不能依赖数据库的季度函数,得自己定义起止时间。
- 简单办法:用
BETWEEN或AND手动划分,例如WHERE order_date >= '2023-04-01' AND order_date 表示 FY2023 Q1 - 更灵活的做法是建一个季度映射表,把每个日期映射到对应财年季度,避免每次写一堆
CASE WHEN - 特别注意:用
容易漏掉当天 23:59:59 之后的数据,推荐统一用左闭右开区间 <code>











