我该如何从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
。
答案 0 :(得分:3)
继续对26的解释-它很可能归因于UTC leap秒-当前为+26。使用您的原始发布值,我假设您的时间戳列以秒为单位-但由于通常以毫秒为单位处理时间,因此我将每个值乘以1000:
因此将1562493806000转换为UTC时间和日期:
Sun Jul 07 2019 10:03:26
您的所有价值观都是如此。因此,时间戳记的来源很可能包括leap秒-如果意图是确切的小时,则不计入它们。
答案 1 :(得分:2)
之所以得到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
答案 2 :(得分:1)
感谢 @forpas ,我设法解决了这个问题。这里的主要问题是我没有考虑时间戳中的秒数。
因此,我检查了从这些日期开始的秒数,并意识到我的样本永远不会以: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
非常感谢, @forpas !