从数据库中获取每个n小时数据的容忍度

时间:2018-09-03 11:50:24

标签: python mysql sql datetime between

我有一个MySQL数据库,每10分钟在其中写入一次数据。即:

+---------------------+
| datetime            |
+---------------------+
| 2018-09-03 13:01:49 |
| 2018-09-03 12:51:49 |
| 2018-09-03 12:41:49 |
+---------------------+

在我的Python代码中,我只想获取“完全” n小时前的行,即:

+---------------------+
| datetime            |
+---------------------+
| 2018-09-03 13:01:49 |
| 2018-09-03 12:01:49 |
| 2018-09-03 11:01:49 |
| 2018-09-03 10:01:49 |
| 2018-09-03 09:01:49 |
| 2018-09-03 08:01:49 |
+---------------------+

我有这段代码可以返回我想要的数据:

cursor.execute('SELECT max(datetime) FROM temperatures')
last_record_datetime = cursor.fetchone()
last_record_min = last_record_datetime[0].minute

query = f'SELECT * FROM temperatures WHERE DATETIME LIKE "%:%{last_record_min}:%" ORDER BY ID DESC LIMIT 20'
cursor.execute(query)
query_result = cursor.fetchall()

这里是我的问题:如果我将重新引导系统,或者出现一些问题或延迟,并且最后一条记录的日期时间和最后一条记录之前的记录的分钟数将不对应,我将从数据库中得到空答复(因为查询... LIKE "22"与查询... LIKE "21"不匹配。

那么,从数据库中获取具有一定容忍度(例如+ -4.99分钟)的数据的最佳方法是什么?

3 个答案:

答案 0 :(得分:0)

如果您大约每10分钟写入一次数据,则意味着您要在按def assess_rep(dataframe): for i in dataframe: a = i[i > 1].sum(axis= 0).astype(int).sort_values(ascending = False) a.plot(kind = 'bar') return 进行订购时每6行获取一次。

您可以尝试以下方法:

datetime

这是另一种方法,它将计算日期时间与最近日期相距“整整一小时”的时间,并根据该日期进行过滤(允许时间相差5分钟):

select @rn := 1;

select `datetime` from (
    select @rn := @rn + 1 rn, `datetime` from temperatures
    order by `datetime` desc
) where mod(rn, 6) = 1
--limit 20

答案 1 :(得分:0)

假设您只需要1小时或更短的数据,而datetime是您的列名。

'

答案 2 :(得分:0)

假设您想要最后记录时间附近的记录,则应尝试查找最后记录时间之间的时差,例如

SELECT * FROM temperatures WHERE DATETIME BETWEEN DATE_SUB({last_record_min}, INTERVAL 5 MINUTE) AND DATE_ADD({last_record_min}, INTERVAL 5 MINUTE) ORDER BY ID DESC LIMIT 20