SQLite按DateTime排序获取数据无效问题求助
解决SQLite按日期时间排序无效的问题
嘿,我明白你碰到的头疼问题了——想按日期时间顺序取SQLite的数据,但排序完全没效果,还没任何报错。这问题根源其实出在你存储日期的格式上!
你现在用的dd/MM/yyyy hh:mm a是字符串格式,SQLite对这种格式排序时,只会按字符的ASCII码顺序比较,而不是时间逻辑顺序。比如31/01/2023会排在01/02/2023前面(因为字符3比0大),但实际时间上1月31日是早于2月1日的,自然就乱了。
给你两个靠谱的解决方案,按需选择:
方案1:修改存储格式(最推荐,一劳永逸)
直接把存储的日期改成SQLite原生支持的格式,或者时间戳,排序会直接生效:
改成ISO8601标准格式
修改你的getDateTime()方法,生成yyyy-MM-dd HH:mm:ss格式的字符串(SQLite能直接识别为datetime类型):
private String getDateTime() { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); dateFormat.setTimeZone(TimeZone.getDefault()); // 可选,确保时区匹配你的需求 Date date = new Date(); return dateFormat.format(date); }
之后查询时直接用:
SELECT * FROM your_table ORDER BY your_date_column ASC; -- 或DESC降序
存储时间戳(性能最优)
直接存储System.currentTimeMillis()返回的long型时间戳,排序效率更高,查询时再转成你需要的格式:
// 插入时获取时间戳 private long getTimestamp() { return System.currentTimeMillis(); }
查询排序语句:
SELECT * FROM your_table ORDER BY timestamp_column ASC;
方案2:不修改存储,查询时转换格式(适合已有大量数据的情况)
如果不想改动现有数据,可以在查询时把字符串格式转成SQLite能识别的datetime类型。针对你的dd/MM/yyyy hh:mm a格式,需要先把它转换成24小时制的标准格式,再用datetime()函数解析:
假设你的日期列名为date_col,查询语句如下:
SELECT * FROM your_table ORDER BY datetime( -- 拼接yyyy-MM-dd部分 substr(date_col, 7, 4) || '-' || substr(date_col, 4, 2) || '-' || substr(date_col, 1, 2) || ' ' || -- 处理12小时转24小时 CASE WHEN substr(date_col, -2) = 'PM' AND substr(date_col, 12, 2) != '12' THEN cast(substr(date_col, 12, 2) as integer) + 12 WHEN substr(date_col, -2) = 'AM' AND substr(date_col, 12, 2) = '12' THEN '00' ELSE substr(date_col, 12, 2) END || substr(date_col, 14, 3) ) ASC;
这段SQL的逻辑是:拆分原字符串的年月日时分,处理AM/PM转24小时制,最后拼接成SQLite能识别的时间格式,再按时间排序。
注意:这种转换会增加查询的性能开销,数据量大时不推荐。
内容的提问来源于stack exchange,提问作者MohammadAli




