SQL Server中如何正确获取季度字符串列的MAX()值?
为什么直接用MAX()会出错?
我之前也踩过这个坑!问题出在数据库把Quarter列的内容当作普通字符串来比较排序。字符串是从左到右逐个字符对比的:比如Q4-2017和Q1-2018,先看第三个字符(Q后面的数字),4比1大,所以数据库会判定Q4-2017更大,完全忽略了后面年份的大小,这就导致结果不符合我们的预期。
要正确拿到时间上最新的季度,我们得先把这种字符串格式的季度转换成能按时间排序的类型,或者拆分出年份和季度来做排序判断。
具体解决方案
下面给你几种主流数据库的实现方式,你可以根据自己用的数据库选:
MySQL/MariaDB 版本
用STR_TO_DATE()把季度字符串转成日期,再取最大值就行:
-- 得到日期格式的最大季度 SELECT MAX(STR_TO_DATE(Quarter, 'Q%q-%Y')) AS latest_quarter_date FROM your_table_name; -- 如果要返回原格式的字符串,再用DATE_FORMAT转回去 SELECT DATE_FORMAT(MAX(STR_TO_DATE(Quarter, 'Q%q-%Y')), 'Q%q-%Y') AS latest_quarter FROM your_table_name;
SQL Server 版本
可以用DATEFROMPARTS(),先拆分出年份和季度,再拼成日期:
-- 得到日期格式的最大季度 SELECT MAX(DATEFROMPARTS( CAST(RIGHT(Quarter, 4) AS INT), -- 提取年份部分 (CAST(SUBSTRING(Quarter, 2, 1) AS INT) - 1)*3 + 1, -- 把季度转成对应季度的第一个月 1 )) AS latest_quarter_date FROM your_table_name; -- 返回原格式字符串用FORMAT SELECT FORMAT(MAX(DATEFROMPARTS( CAST(RIGHT(Quarter, 4) AS INT), (CAST(SUBSTRING(Quarter, 2, 1) AS INT) - 1)*3 + 1, 1 )), 'Qq-yyyy') AS latest_quarter FROM your_table_name;
PostgreSQL 版本
用TO_DATE()函数转换,注意格式里的引号:
-- 日期格式结果 SELECT MAX(TO_DATE(Quarter, '"Q"q-yyyy')) AS latest_quarter_date FROM your_table_name; -- 原格式字符串结果 SELECT TO_CHAR(MAX(TO_DATE(Quarter, '"Q"q-yyyy')), '"Q"q-yyyy') AS latest_quarter FROM your_table_name;
通用兼容版(适合所有数据库)
如果不想依赖数据库特定的日期函数,那就直接拆分年份和季度,按年份降序、季度降序排序后取第一行:
SELECT Quarter FROM your_table_name ORDER BY CAST(RIGHT(Quarter, 4) AS INT) DESC, -- 先按年份从大到小 CAST(SUBSTRING(Quarter, 2, 1) AS INT) DESC -- 再按季度从大到小 LIMIT 1; -- 取第一行就是最新的季度
内容的提问来源于stack exchange,提问作者mao
相关产品推荐
相关产品推荐

