Python 使用容差从数据库中获取每n小时一次的数据

Python 使用容差从数据库中获取每n小时一次的数据,python,mysql,sql,datetime,between,Python,Mysql,Sql,Datetime,Between,我有一个MySQL数据库,每10分钟写入一次数据。i、 e: +---------------------+ | datetime | +---------------------+ | 2018-09-03 13:01:49 | | 2018-09-03 12:51:49 | | 2018-09-03 12:41:49 | +---------------------+ 在我的Python代码中,我只想得到正好是n小时前的行,即: +------------------

我有一个MySQL数据库,每10分钟写入一次数据。i、 e:

+---------------------+
| 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()
我的问题来了:如果我将重新启动系统,或者会出现一些问题或延迟,并且最后一条记录的datetime中的分钟数和最后一条记录之前的记录将不对应,我将从数据库中得到空的答复,因为查询。。。如22与查询不匹配。。。像21岁


那么,从数据库中获取数据的最佳方法是什么?比如说+-4,99分钟?

如果您大约每10分钟写入一次数据,这意味着您希望在按日期时间排序时,每隔6行获取一次数据

你可以试试这个:

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
这是另一种方法,它将计算距离您的最新日期一小时的截止日期时间,并根据它允许的时间变化5分钟进行过滤:

select @dt := max(`datetime`) from temperatures;

select * from (
    select `datetime`, 
           mod(abs(timestampdiff(minuite,@dt,`datetime`)), 60) minDiff
    from temperatures
) a where minDiff < 5 or minDiff > 55
--limit 20

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

select * from temperatures where TIMESTAMPDIFF(HOUR, datetime, NOW()) <= 1 ; 

假设您希望记录在上一个记录时间附近,您应该尝试查找上一个记录时间之间的时间差,例如

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

数据库有多大?我问的原因是pandas为此支持大量方便的函数,这些函数会让SQL变得混乱。数据库现在非常小,它有4列和大约4k行。但几年后它可能会有数百万行。实际上,在本例中,我只得到20条最后记录。我不需要3小时前的数据,但到目前为止,每1小时前的数据,请按照我的示例进行操作。@user3861588将3替换为1,并更改=为我需要1小时前的数据,2小时前的数据,3小时前的数据。。。假设是18:05,所以我想要18:05,17:05,16:05,15:05,14:05的数据。。。不多也不少。但有一些公差+-4.99 minI认为是相同的解决方案,但如果我的温度传感器不响应,即4次,则每第6行将不会得到我想要的结果,但它将被移动。我认为是相同的解决方案,但如果我的温度传感器不响应,即4次,每第六排不会得到我想要的结果,但它会被改变。买一个新的,每次@user3861588都有响应的。你不能用响应差的硬件神奇地编写工作代码。@MichałTurczyn:替代方法似乎正是我想要的!谢谢。