Целые часы с отметками времени? - PullRequest
1 голос
/ 07 июля 2019

Как выбрать только записи с целыми часами из 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 ]

3 голосов
/ 07 июля 2019

Продолжая объяснение 26 - это, скорее всего, связано с високосными секундами UTC - которое в настоящее время составляет +26. Используя исходные значения записей, я предположил, что ваш столбец меток времени был в секундах, но, поскольку время обычно обрабатывается в миллисекундах, я умножаю каждое значение на 1000:

Таким образом, преобразование 1562493806000 в UTC время и дату:

Sun Jul 07 2019 10:03:26

Это верно для всех ваших ценностей. Таким образом, источник ваших временных меток, по всей вероятности, включает дополнительные секунды - или не учитывает их, если намерение было точным часом.

2 голосов
/ 07 июля 2019

Причина, по которой вы получаете 26, а не 0, состоит в том, что отметка времени также содержит секунды.Преобразуйте свои метки времени UNIX в строки datetime (без секунд), а затем убедитесь, что компонент минут равен :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
1 голос
/ 07 июля 2019

Благодаря @ 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 !

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...