如何在SQLite3中查询特定日期的记录(毫秒时间戳场景)
看起来你遇到的问题根源在于:SQLite的日期函数默认不直接支持毫秒级时间戳,而你的annotated字段存储的是13位的毫秒时间戳(比如1519321923630),直接用普通的日期查询逻辑自然匹配不到数据。我来帮你拆解解决方法:
核心问题分析
SQLite的DATE()、DATETIME()这类函数,处理时间戳时默认认的是秒级时间戳(10位数字),或者ISO标准的日期字符串(比如'2018-02-13 12:34:56')。如果直接把13位的毫秒时间戳丢给这些函数,它会把这个数当成"秒数"来解析——这对应的日期会是几十年甚至几百年后的未来,当然查不到你要的2018年的记录。
解决方案:将毫秒时间戳转成可识别的日期格式
我们需要先把毫秒时间戳转换成秒级,再用SQLite的日期函数解析成日期,然后和目标日期比较。
1. 基础查询(假设annotated是整数类型)
如果你的annotated字段是存储为整数的毫秒时间戳,直接除以1000得到秒级时间戳,再用DATE()函数结合unixepoch参数解析:
SELECT * FROM your_table_name WHERE DATE(annotated / 1000, 'unixepoch') = '2018-02-13';
注意:SQLite的除法默认是浮点数除法,不过
DATE()函数会自动处理浮点数的秒级时间戳,也可以用CAST(annotated AS INTEGER) / 1000强制整数除法,结果是一样的。
2. 如果annotated是字符串类型的毫秒时间戳
如果字段存的是字符串格式的数字(比如'1519321923630'),需要先转成整数再处理:
SELECT * FROM your_table_name WHERE DATE(CAST(annotated AS INTEGER) / 1000, 'unixepoch') = '2018-02-13';
3. 考虑时区的情况
如果你的时间戳是UTC时间,但你想查询本地时区的2018-02-13,可以加上localtime参数:
SELECT * FROM your_table_name WHERE DATE(annotated / 1000, 'unixepoch', 'localtime') = '2018-02-13';
验证转换是否正确
你可以先跑一条测试查询,确认时间戳转换后的日期是否符合预期:
SELECT annotated AS original_timestamp, DATETIME(annotated / 1000, 'unixepoch') AS utc_datetime, DATE(annotated / 1000, 'unixepoch') AS utc_date FROM your_table_name LIMIT 5;
如果转换后的日期和你预期的一致,再用上面的查询就没问题了。
为什么之前的查询失败?
举个例子,如果你之前写的是WHERE DATE(annotated) = '2018-02-13',SQLite会尝试把1519321923630当成日期字符串来解析——这显然不是ISO格式的日期,所以DATE()函数会返回NULL,自然匹配不到任何记录。
内容的提问来源于stack exchange,提问作者Ivan Paredes




