MySQL简单查询按日期排序失效问题求助
问题原因分析
你遇到的问题核心在于**fecha字段是字符串类型**,MySQL对字符串排序是按照字典序来比较的,而不是数值大小。
举个例子,字符串形式的时间戳"982428253"和"1525662000",字典序比较时会先看第一个字符:'9' > '1',所以不管后面的数字是什么,"982428253"都会被判定为"更大",自然就排在了更前面——这就是旧结果出现在顶部的原因。
解决方法
临时修复(无需修改表结构)
你可以在排序时把字符串类型的时间戳转换成数值类型,这样就能按照时间戳的实际大小排序了。修改你的查询语句,把ORDER BY fecha DESC替换成下面两种方式之一:
- 使用
CAST函数转换:
SELECT DISTINCT contenidoID, titulo, fecha, DATE_FORMAT(FROM_UNIXTIME(fecha), '%d-%m-%Y') AS date FROM contenidos WHERE publicado = 1 ORDER BY CAST(fecha AS UNSIGNED) DESC
- 使用
CONVERT函数转换:
SELECT DISTINCT contenidoID, titulo, fecha, DATE_FORMAT(FROM_UNIXTIME(fecha), '%d-%m-%Y') AS date FROM contenidos WHERE publicado = 1 ORDER BY CONVERT(fecha, UNSIGNED INTEGER) DESC
长期最优方案
既然fecha存储的是Unix时间戳(整数),建议直接修改表结构,把fecha字段的类型从string改成INT(如果是13位时间戳可以用BIGINT)。这样后续所有涉及排序、筛选的操作都不需要额外转换,性能和可读性都会更好:
ALTER TABLE contenidos MODIFY COLUMN fecha INT UNSIGNED NOT NULL;
(注意执行前最好备份数据,确保所有时间戳字符串都能正常转换为整数)
内容的提问来源于stack exchange,提问作者Rosamunda
相关产品推荐
相关产品推荐

