如何在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
相关产品推荐
相关产品推荐

