按 ASC 排序 DATE_FORMAT '%Y-%c'

Sort DATE_FORMAT '%Y-%c' in ASC

我有疑问

SELECT DATE_FORMAT(sys_date, '%Y-%c') as month, COUNT(DATE_FORMAT(sys_date, '%Y-%c'))
FROM sale
GROUP BY month
ORDER BY month ASC

即returns下面的结果,

month   COUNT(DATE_FORMAT(sys_date, '%Y-%c'))
2017-10 204
2017-11 178
2017-12 88
2017-7  3
2017-8  1
2017-9  153
2018-1  91
2018-2  86
2018-3  67
2018-4  109
2018-5  131
2018-6  47
2018-7  50
2018-8  36
2018-9  39

如何使输出按正确的升序排列?喜欢,

month   COUNT(DATE_FORMAT(sys_date, '%Y-%c'))
2017-7  3
2017-8  1
2017-9  153
2017-10 204
2017-11 178
2017-12 88
2018-1  91
2018-2  86
2018-3  67
2018-4  109
2018-5  131
2018-6  47
2018-7  50
2018-8  36
2018-9  39

我试过使用 MONTH(month), YEAR(month) ASC 和网站上列出的许多其他选项。但似乎没有任何效果。

根据YEAR and MONTH直接从sys_date获得的数据进行排序。由于您启用了 only_full_group_by 模式,因此您需要在 SELECT 部分中获取 YEARMONTH 值,以便 ORDER BY 子句可以将其用于排序。使用以下查询:

SELECT YEAR(sys_date) as ysysdate, 
       MONTH(sys_date) as msysdate, 
       DATE_FORMAT(sys_date, "%Y-%c") as ymonth,
       COUNT(*)
FROM sale
GROUP BY ymonth
ORDER BY ysysdate ASC, msysdate ASC

因为计算出来的month是按字母顺序排列的。但是您可以保留 ORDER BY month 并将其更改为前导 0 的格式,表示月份 < 10.
这样字符串值都将具有相同的长度,并且按字母顺序排序将是正确的。

因为比较字符串时 '10' < '9' 但 '09' < '10'

为此,只需将 %c 更改为 %mReference

此外,COUNT可以简化。

SELECT DATE_FORMAT(sys_date, '%Y-%m') as month, COUNT(*) as Total
FROM sale
GROUP BY month
ORDER BY month

如果您确实希望使用“%Y-%c”格式?
然后您可以在 ORDER BY 中包含年份和月份的长度。

SELECT DATE_FORMAT(sys_date, '%Y-%c') as month, COUNT(*) as Total
FROM sale
GROUP BY YEAR(sys_date), month
ORDER BY YEAR(sys_date), LENGTH(month), month