You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

SQLite按DateTime排序获取数据无效问题求助

解决SQLite按日期时间排序无效的问题

嘿,我明白你碰到的头疼问题了——想按日期时间顺序取SQLite的数据,但排序完全没效果,还没任何报错。这问题根源其实出在你存储日期的格式上!

你现在用的dd/MM/yyyy hh:mm a字符串格式,SQLite对这种格式排序时,只会按字符的ASCII码顺序比较,而不是时间逻辑顺序。比如31/01/2023会排在01/02/2023前面(因为字符30大),但实际时间上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

火山引擎 最新活动