Mac端Things App SQLite REAL类型日期字段查询返回null如何解决
问题原因
直接调用date(creationDate)返回空的核心原因是:Mac端Things的TMTask表creationDate字段存储的不是SQLite标准儒略日,也不是以1970年为基准的Unix时间戳,而是苹果Core Data框架的时间戳,以2001年1月1日 00:00:00 UTC为基准计算的累计秒数,SQLite原生日期函数无法直接识别该格式,所以返回null。
正确查询方法
日期格式转换
要把该字段转为人类可读的日期格式,需要给时间戳加上苹果基准时间对应的Unix偏移量978307200,再指定unixepoch参数让SQLite正确识别:
-- 转换为UTC时间 SELECT datetime(creationDate + 978307200, 'unixepoch') AS creation_date_utc FROM TMTask; -- 转换为本地时区时间(和Things App内显示时间一致) SELECT datetime(creationDate + 978307200, 'unixepoch', 'localtime') AS creation_date_local FROM TMTask;
查询今日创建的所有任务
使用转换后的日期和当前本地日期匹配即可,对应SQL如下:
SELECT * FROM TMTask WHERE date(creationDate + 978307200, 'unixepoch', 'localtime') = date('now', 'localtime');
注意事项
- 操作前请先备份Things的原始SQLite数据库文件,避免直接操作导致App数据损坏
- 正式执行查询前可先执行以下语句验证时间转换正确性,确认转换结果和App内显示的任务创建时间一致:
SELECT creationDate, datetime(creationDate + 978307200, 'unixepoch', 'localtime') AS local_creation_time FROM TMTask LIMIT 10;
内容的提问来源于stack exchange,提问作者Dominik
相关产品推荐
相关产品推荐

