Oracle APEX复选框组日期SQL升序排序异常问题求助
问题根因
排序异常的核心原因是参与排序的值是DD.MM.YY格式的字符串,而非原生日期类型。数据库执行order by时对字符串按字典序逐字符比较:
- 先比较最左侧的"日"位字符,
30开头的字符串第二位是0,会全部排在第二位是1的31开头字符串之前 - 日字段相同的情况下再逐位比较月份、年份字符,排序逻辑完全和实际时间先后无关,最终出现乱序。
修复方案
根据字段实际存储类型选择对应写法即可:
字段为原生DATE类型
如果date列本身是Oracle的DATE类型,只是APEX复选框自动把日期格式化为DD.MM.RR的显示样式,优先直接按原始日期字段排序即可:
select distinct "date" as r, "date" as d from statistic order by "date" asc;
如果上述写法仍返回乱序,说明APEX渲染LOV时做了隐式类型转换,可以显式将显示值转为日期后再排序:
select distinct "date" as r, "date" as d from statistic order by to_date("date", 'DD.MM.RR') asc;
字段为存储日期字符串的VARCHAR2类型
如果date列本身存的就是DD.MM.RR格式的字符串,必须先将字符串转换为DATE类型再排序,直接对字符串排序永远会按字典序排列,无法得到时间顺序结果:
select distinct "date" as r, "date" as d from statistic order by to_date("date", 'DD.MM.RR') asc;
APEX配置注意事项
配置Checkbox Group项的LOV时,不要勾选按显示值排序选项,否则即使SQL返回顺序正确,APEX也会自动按显示的字符串重新排序,覆盖SQL中定义的排序规则。
注意:
date是Oracle数据库保留关键字,如果列名确实为date,查询时必须用双引号包裹,否则会触发语法错误。
内容的提问来源于stack exchange,提问作者Elias
相关产品推荐
相关产品推荐

