SQLite中BETWEEN仅比较日期日部分而非完整日期的问题
SQLite日期查询无结果的原因与解决方法
根本原因
你的date_added列存储的是DD/MM/YYYY格式的字符串,而非SQLite标准的日期格式(ISO8601:YYYY-MM-DD)。SQLite对字符串的比较是逐字符按字典序进行,不是按日期逻辑判断:
- 第一个查询中,
'29/08/2023'与'31/08/2023'的前两位字符29<31,后续月份、年份一致,字符串对比结果和日期逻辑一致,所以能返回数据。 - 第二个查询中,
'01/09/2023'的第一个字符0小于'29/08/2023'的第一个字符2,因此整个字符串'01/09/2023'<'29/08/2023',between要求date_added >= '29/08/2023'且date_added <= '01/09/2023',没有数据能同时满足这两个条件,所以无结果。
临时解决方法
使用SQLite的strftime函数,将DD/MM/YYYY格式的字符串转换为标准ISO格式后再比较:
select * from sold where strftime('%Y-%m-%d', date_added, '%d/%m/%Y') between '2023-08-29' and '2023-09-01'
其中第三个参数'%d/%m/%Y'用于指定输入字符串的日期格式,让SQLite正确解析。
长期优化方案
修改表结构,将date_added列改为存储ISO8601格式的字符串(如YYYY-MM-DD HH:MM:SS),或直接使用SQLite的DATE/DATETIME类型(本质为TEXT,但强制遵循ISO格式)。后续插入数据时统一按该格式存储,这样日期比较、排序、函数计算都能直接按日期逻辑执行,避免字符串对比的问题。
内容的提问来源于stack exchange,提问作者Bendaoud Simou
相关产品推荐
相关产品推荐

