PostgreSQL如何实现格式化年月按实际日期降序排序
PostgreSQL年月按时间降序排序解决方案
问题原因
你当前写法的问题是:排序逻辑基于to_char转换后的字符串结果,PostgreSQL会按照字符串的字典序排序,因此会出现April(A开头)排在最后、March(M开头)排在最前的错误结果,不符合实际年月的先后顺序。
正确写法
你需要基于原始日期的年月维度排序,而非转换后的字符串,使用DATE_TRUNC函数将日期截断到月份维度后排序即可:
SELECT DISTINCT TO_CHAR(orderdate::date, 'FMMonth YYYY') AS monthName FROM 你的表名 -- 替换为实际业务表名 ORDER BY DATE_TRUNC('month', orderdate::date) DESC;
DATE_TRUNC('month', 日期)会把给定日期统一转换为当月第一天的时间格式,按这个值降序就是按实际年月的先后顺序排序,不会受字符串字典序干扰。
可选优化写法
也可以用GROUP BY替代DISTINCT,逻辑更清晰,大数据量下性能更稳定:
SELECT TO_CHAR(orderdate::date, 'FMMonth YYYY') AS monthName FROM 你的表名 -- 替换为实际业务表名 GROUP BY DATE_TRUNC('month', orderdate::date), monthName ORDER BY DATE_TRUNC('month', orderdate::date) DESC;
内容的提问来源于stack exchange,提问作者sheetaldharerao
相关产品推荐
相关产品推荐

