修改按日期排序的SQL查询(日期字段为DD-MMM-YYYY格式的varchar类型)
问题根因
arr_date字段为varchar字符串类型,直接执行ORDER BY arr_date DESC时会按字符串字典序逐位比对,仅优先匹配开头的日数字,不会按照实际日期的时间先后逻辑排序,因此出现你描述的排序错乱问题。
解决方案
核心思路是先将arr_date字符串转换为日期类型,再基于日期类型排序即可得到正确结果,根据你使用的数据库类型选择对应语法即可:
适用MySQL(最常见的PHP适配数据库)
使用STR_TO_DATE函数做字符串转日期,匹配你的日期格式模板为%d-%b-%Y %H:%i:%s,可自定义空值的排序优先级:
// 空值排在最末尾的写法 $sqlC = "SELECT id, con_number, arr_date, arr_flag, reg FROM con WHERE arr_flag=0 AND reg='".$region."' ORDER BY IF(arr_date IS NULL OR arr_date = '', 1, 0), STR_TO_DATE(arr_date, '%d-%b-%Y %H:%i:%s') DESC";
注:直接拼接
$region变量存在SQL注入风险,建议改为预处理语句传参更安全。
适用Oracle
使用TO_DATE函数转换:
ORDER BY TO_DATE(arr_date, 'DD-MON-YYYY HH24:MI:SS') DESC NULLS LAST
适用SQL Server
使用TRY_CONVERT函数转换:
ORDER BY TRY_CONVERT(DATETIME, arr_date, 106) DESC
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

