如何从sqlite中选择只包含整个时间的条目,其中日期作为时间戳?
以下是DB的摘录:
Temper Timestamp Converted date (only for debugging)
24.13 1562493806 07/07/2019-12:03
24.10 1562493746 07/07/2019-12:02
24.13 1562493686 07/07/2019-12:01
24.13 1562493626 07/07/2019-12:00
24.13 1562493566 07/07/2019-11:59
24.13 1562493506 07/07/2019-11:58以及SELECT语句的期望输出:
24.13 - 1562493626 - 07/07/2019-12:00我尝试使用timestamp % 60 = 0,但是上面的所有条目都返回mod = 26,而不是0。
发布于 2019-07-07 14:58:05
得到26而不是0的原因是时间戳也包含秒。
将UNIX时间戳转换为日期时间字符串(没有秒),然后检查分钟组件是否为:00
SELECT *
FROM tablename
WHERE strftime('%d-%m-%Y %H:%M', datetime(timestamp, 'unixepoch')) LIKE '%:00'我想你知道你的预期结果并不是一个小时,因为它包含26秒。
只有当你省略了秒的时候,它才被认为是一个小时。
编辑
检查这是否更快:
SELECT *
FROM tablename
WHERE (timestamp - (timestamp % 60)) % 3600 = 0或更好:
SELECT *
FROM tablename
WHERE (timestamp / 60) % 60 = 0发布于 2019-07-07 19:59:01
继续解释26 -这很可能是由于UTC的闰秒-它目前是在+26。使用原始的post值,我假定时间戳列是以秒为单位的--但是由于时间通常以毫秒来处理,所以我将每个值乘以1000:
因此,将1562493806000转换为UTC时间和日期:
Sun Jul 07 2019 10:03:26你所有的价值观都是这样。所以,你的时间戳的来源很可能包括闰秒,或者如果你的意图是一个确切的时间,就没有解释它们。
发布于 2019-07-07 15:51:19
多亏了@forpa,我成功地修正了公式。这里的主要问题是我没有考虑时间戳中的秒数。
因此,我检查了这些日期的秒数,并意识到我的示例永远不会以:00结尾,而总是以:26或:27结尾。因此,我调整了公式,在几秒钟内考虑了这种容限:
SELECT *
FROM tablename
WHERE timestamp % 3600 < 60选择的结果是:
23.38 1558008027 2019/05/16 14:00:27
23.25 1558004427 2019/05/16 13:00:27
23.06 1558000827 2019/05/16 12:00:27
22.88 1557997227 2019/05/16 11:00:27
22.94 1557993626 2019/05/16 10:00:26
23.13 1557990026 2019/05/16 09:00:26
23.19 1557986426 2019/05/16 08:00:26非常感谢,@forpa!
https://stackoverflow.com/questions/56923228
复制相似问题