统计近14天帖子数量时日期排序异常的技术问题
解决日期排序错误的问题
我一眼就看出问题出在哪了——你是按格式化后的字符串日期排序的,这可不靠谱!
问题原因
你SQL里的date字段是用DATE_FORMAT(created_at, "%d. %b")生成的字符串(比如01. Oct、25. Sep)。当你用ORDER BY date ASC时,数据库会按照字符串的字符顺序来排序,而不是实际的日期顺序。比如字符串01. Oct的第一个字符是0,25. Sep的第一个字符是2,0的ASCII码比2小,所以01. Oct会排在25. Sep前面,但实际上9月25日比10月1日早,这就导致了排序顺序完全颠倒。
修正后的SQL方案
你需要按原始日期的时间顺序来排序,而不是格式化后的字符串。这里有两种可靠的写法:
方案1:按原始日期的日期部分分组和排序
SELECT DATE_FORMAT(created_at, "%d. %b") AS date, count(*) as count FROM posts WHERE created_at BETWEEN NOW() - INTERVAL 14 DAY AND NOW() GROUP BY DATE(created_at) ORDER BY DATE(created_at) ASC;
这里用DATE(created_at)提取日期部分来分组和排序,它是真正的日期类型,会按照时间先后正确排序。
方案2:保留原分组逻辑,按分组内最早的时间排序
如果你想继续按格式化后的date分组,可以用MIN(created_at)拿到每组对应的最早时间,再按这个时间排序:
SELECT DATE_FORMAT(created_at, "%d. %b") AS date, count(*) as count FROM posts WHERE created_at BETWEEN NOW() - INTERVAL 14 DAY AND NOW() GROUP BY date ORDER BY MIN(created_at) ASC;
这样既保留了你想要的格式化日期展示,又能保证排序是按实际时间顺序来的。
这两种写法都能让你的图表日期按9月25日到10月9日的正确顺序排列,解决你现在的排序问题。
内容的提问来源于stack exchange,提问作者CunnertA
相关产品推荐
相关产品推荐

