You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQLite数据库表中筛选出最新日期?

解决SQLite中dd/mm/yyyy格式日期取最大值的问题

这个问题我之前也踩过坑!核心原因是你的created列存的是字符串类型,SQLite用MAX()时只会按字符串的字典序比较,完全不识别日期逻辑——比如"31/12/2020"作为字符串会比"01/01/2024"大,因为第一个字符'3'比'0'优先级高,直接忽略了年份的差异。

给你几个实用的解决方案:

方案1:转换为SQLite可识别的日期格式后取最大值

SQLite默认只认yyyy-mm-dd这种ISO标准格式的日期字符串,我们可以把dd/mm/yyyy拆分成年、月、日,重新组合成ISO格式后再用MAX()计算:

SELECT MAX(
    SUBSTR(created, 7, 4) || '-' || SUBSTR(created, 4, 2) || '-' || SUBSTR(created, 1, 2)
) AS latest_date
FROM account;

这里SUBSTR(created,7,4)提取年份,SUBSTR(created,4,2)提取月份,SUBSTR(created,1,2)提取日期,拼接成yyyy-mm-dd后,MAX()就能正确识别日期的先后顺序了。

如果想直接得到原dd/mm/yyyy格式的最新日期,也可以用排序加LIMIT的方式:

SELECT created
FROM account
ORDER BY
    SUBSTR(created,7,4) DESC,  -- 按年份降序
    SUBSTR(created,4,2) DESC,  -- 按月份降序
    SUBSTR(created,1,2) DESC   -- 按日期降序
LIMIT 1;

方案2:修改列类型(推荐长期优化方案)

如果业务允许,最好把created列的类型改成DATE,从根源上避免这类问题:

-- 1. 添加临时日期列
ALTER TABLE account ADD COLUMN temp_created DATE;
-- 2. 把原字符串日期转换为标准日期格式存入临时列
UPDATE account SET temp_created = DATE(
    SUBSTR(created,7,4) || '-' || SUBSTR(created,4,2) || '-' || SUBSTR(created,1,2)
);
-- 3. 替换原列
ALTER TABLE account DROP COLUMN created;
ALTER TABLE account RENAME COLUMN temp_created TO created;

之后再执行SELECT MAX(created) FROM account;就能直接得到正确结果,后续所有日期相关的查询都会更高效省心。

内容的提问来源于stack exchange,提问作者adrian38

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 13:22:36