You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在SQLite3中查询特定日期的记录(毫秒时间戳场景)

解决SQLite中毫秒级时间戳的特定日期查询问题

看起来你遇到的问题根源在于: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

火山引擎 最新活动