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

