Получать каждые n-часовые данные из базы данных с допуском - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть база данных 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()

И тут возникает мой вопрос: если я перезагружу систему, или возникнет какая-то проблема или задержка, и минуты в дате-времени последней записи и записи до того, как последняя не будет соответствовать, я получу пустой ответ из базы данных ( потому что запрос ... LIKE "22" не совпадает с запросом ... LIKE "21").

Итак, как лучше всего получить данные из базы данных с некоторым допуском (скажем, + - 4,99 мин)?

Ответы [ 3 ]

0 голосов
/ 03 сентября 2018

Допустим, вам нужны данные только на 1 час или меньше, а datetime - это имя вашего столбца.

select * from temperatures where TIMESTAMPDIFF(HOUR, datetime, NOW()) <= 1 ; 
0 голосов
/ 03 сентября 2018

Предполагая, что вы хотите, чтобы записи имели место во время последней записи, вы должны попытаться найти разницу во времени между последней записанной временем, что-то вроде

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
0 голосов
/ 03 сентября 2018

Если вы пишете свои данные примерно каждые 10 минут, это означает, что вы хотите получать каждую 6-ю строку, когда вы заказываете по datetime.

Вы можете попробовать это:

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
...