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

SQLite时间查询求助:毫秒时间戳筛选近6个月数据失败

解决SQLite中毫秒时间字段的筛选问题

我明白你遇到的问题了——你试图用MillisField > 2017-12-01筛选数据,但结果完全不符合预期,这是因为SQLite对这个表达式的解析和你想的不一样。

问题根源

2017-12-01在SQLite里会被当作算术运算处理:2017减12再减1,结果是2004。所以你实际是在筛选毫秒数大于2004的记录,这显然不是你要的近6个月数据。

正确的筛选方法

这里有两种高效的解决思路,推荐第一种(性能更优):

1. 将目标日期转换为毫秒数,直接比较数值

SQLite的strftime('%s', '日期字符串')可以把日期转换成Unix时间戳(单位:秒),乘以1000就得到毫秒数,和你的MillisField类型匹配。示例语句:

SELECT 
  strftime('%Y %m %d %H:%M:%S', MillisField / 1000, 'unixepoch') as date
FROM 
  your_table
WHERE 
  MillisField > strftime('%s', '2017-12-01') * 1000;

注意:如果MillisField有索引,这种方式可以直接利用索引,查询速度更快。

2. 将毫秒字段转换为日期字符串,再与目标日期比较

如果你更习惯用日期字符串比较,可以把MillisField转换成标准日期格式后再筛选:

SELECT 
  strftime('%Y %m %d %H:%M:%S', MillisField / 1000, 'unixepoch') as date
FROM 
  your_table
WHERE 
  strftime('%Y-%m-%d', MillisField / 1000, 'unixepoch') > '2017-12-01';

提示:这种方式需要对每条记录的MillisField做转换,若数据量很大,性能会比第一种差一些。

顺便修正你的日期转换语句

你原来的转换语句strftime(MillisField*1000,'%Y %m %d %H:%M:%s')有几个小问题:

  • 参数顺序反了:strftime的第一个参数应该是格式字符串,第二个才是时间相关的参数
  • 单位处理错误:MillisField是毫秒,需要除以1000得到秒数,再配合unixepoch参数解析成日期
  • %s是Unix时间戳(秒数),如果你想显示两位秒数,应该用%S(大写)

修正后的转换语句就是上面示例里的strftime('%Y %m %d %H:%M:%S', MillisField / 1000, 'unixepoch') as date。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:00:53