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

Android SQLite中筛选unix时间戳列匹配当日日期的记录方法

如何在Android SQLite中筛选当日日期的记录(基于毫秒级Unix时间戳)

我来帮你搞定这个问题!你的核心问题在于SQLite默认处理的是秒级Unix时间戳,而你存在due_date列里的是毫秒级(13位,比如1526565900000),再加上之前的语句有几个小问题,我给你一步步解决:

正确的查询语句

首先直接给你能拿到所有当日记录的SQL:

SELECT * FROM task
WHERE date(due_date / 1000, 'unixepoch') = date('now', 'localtime', 'start of day');

或者用strftime做日期格式化对比,效果完全一致:

SELECT * FROM task
WHERE strftime('%Y-%m-%d', due_date / 1000, 'unixepoch') = strftime('%Y-%m-%d', 'now', 'localtime');

为什么之前的语句无效?

我来拆解你之前尝试的问题:

  • 你用date('now', 'start of day')直接对比due_date,但due_date是毫秒级数字,而date()返回的是字符串(比如2024-05-20),两者类型不匹配,自然无法匹配。
  • 你加的group by due_date完全多余,甚至会帮倒忙——它会把相同due_date的记录合并成一行,这就是你拿不到全部3条符合条件记录的原因!

关键细节说明

  1. 毫秒转秒:SQLite的unixepoch修饰符默认处理的是秒级时间戳(10位),所以必须把你的13位毫秒时间戳除以1000,转换成它能识别的格式。
  2. 时区匹配:加上'localtime'是为了让SQLite使用你设备的本地时区计算当日日期,避免UTC时区导致的日期偏差(比如凌晨时分,UTC日期和本地日期可能不同)。
  3. 性能优化(可选):如果你的task表数据量较大,建议给due_date加个索引,能大幅提升查询速度:
CREATE INDEX idx_task_due_date ON task(due_date);

验证方法

你可以先运行这条语句查看转换后的日期是否正确,确认逻辑没问题:

SELECT name, due_date, date(due_date / 1000, 'unixepoch') AS formatted_date FROM task;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:51:20