结论:QUARTER() 必须与 YEAR() 联用才能准确判断当前季度,否则跨年时会误判;正确写法为 YEAR(date_col) = YEAR(NOW()) AND QUARTER(date_col) = QUARTER(NOW()),或改用日期范围查询以提升性能。

直接说结论:用 QUARTER() 函数判断日期是否在当前季度,必须配合 YEAR() 一起用,否则跨年时会误判——比如 2024-12-15 和 2025-03-10 的 QUARTER() 都是 4,但显然不在同一个“当前季度”。
QUARTER() 单独用会出什么问题
QUARTER() 只返回 1–4 的整数,不带年份信息。如果只写 QUARTER(date_col) = QUARTER(NOW()),那么所有“本季度数字相同”的历史或未来日期都会被捞出来,比如:
- 2023-Q4(2023-10-01 至 2023-12-31)会被当成“当前季度”匹配到 2025-Q4
- 数据库里存了多年数据时,这个条件等价于“查所有 Q1 / Q2 / Q3 / Q4”,完全失去时间过滤意义
正确写法:YEAR() + QUARTER() 联合判断
必须同时比对年份和季度。MySQL 中标准写法是:
WHERE YEAR(date_col) = YEAR(NOW()) AND QUARTER(date_col) = QUARTER(NOW())
PostgreSQL 不支持 QUARTER(),得换写法:EXTRACT(QUARTER FROM date_col) = EXTRACT(QUARTER FROM NOW()),同样要加 EXTRACT(YEAR FROM ...) 判断。
- SQL Server 用
DATEPART(quarter, date_col)和DATEPART(year, date_col) - 注意
NOW()在某些环境(如旧版 MySQL)可能不支持,可换成CURDATE()或SYSDATE(),效果一致 - 如果字段是
DATETIME或TIMESTAMP类型,QUARTER()仍能正常提取,无需先DATE()截断
更安全的替代方案:用日期范围代替函数计算
函数判断在大数据量下可能无法走索引(尤其当对 date_col 套函数时)。推荐改用范围查询:
WHERE date_col >= '2024-04-01' AND date_col < '2024-07-01'
这个写法可命中 date_col 上的索引。动态生成范围可以用:
- MySQL:用
MAKEDATE(YEAR(NOW()), 1) + INTERVAL (QUARTER(NOW()) - 1) QUARTER算起点 - 但实际项目中,更常见的是在应用层算好起止日期再传入 SQL,避免 SQL 层逻辑过重
- 如果必须纯 SQL,注意
结尾(而非 <code>),因为季度末日可能有时间部分(如 <code>'2024-06-30 23:59:59')
真正容易被忽略的点是:季度边界不是固定天数(Q1 是 90/91 天,Q2 是 91 天),所以别手写 DATE_ADD(date_col, INTERVAL 3 MONTH) 来推季度——它会把 2024-01-31 变成 2024-04-30,漏掉 4 月最后一天。

















