是从时间戳记开始的整个小时?

时间:2019-07-07 14:52:10

标签: android sqlite timestamp

我该如何从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

3 个答案:

答案 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