#python #sql #database #sqlite #time
#python #sql #База данных #sqlite #время
Вопрос:
Я пытаюсь найти разницу между двумя временными метками с миллисекундами в SQLITE, как показано ниже
select abs(CAST ( (JulianDay(t1.TIME1) - JulianDay(t1.TIME2) ) * 24 * 60 * 60 * 1000 AS INTEGER) ) diff_millisec
from time_table;
Для этих данных:
t1.TIME1 - 14:14:04.446258
t1.TIME2 - 14:14:04.446377
Ответ равен 0.
Для другого набора значений
t1.TIME1 - 14:13:27.742646
t1.TIME2 - 14:13:27.649184
Ответ 93
Почему первый набор дает 0? Есть ли способ указать точное значение.
Комментарии:
1. Полученные результаты верны. Разница первых 2 временных меток составляет 0 миллисекунд, а для последних 2 составляет 93 миллисекунды. В чем проблема?
Ответ №1:
SQLite обеспечивает точность до миллисекунд при использовании функции like julianday()
, поскольку только первые три цифры (после точки) имеют значение для результата, как указано в функциях даты и времени, поэтому обе временные строки 14:14:04.446258
и 14:14:04.446377
оцениваются как 14:14:04.446
и считаются равными.
Итак, результаты, которые вы получаете за миллисекунды, верны.
Если вам нужна разница в микросекундах, вы должны добавить разницу последних 3 цифр 2 раза:
select abs(CAST(
(JulianDay(TIME1) - JulianDay(TIME2)) * 24 * 60 * 60 * 1000 * 1000
(substr(TIME1, -3) - substr(TIME2, -3))
AS INTEGER
)) diff_microsec
from time_table;
но для большей точности вы должны использовать strftime()
, чтобы получить разницу в секундах, а затем добавить разницу в микросекундах:
select abs((strftime('%s', TIME1) - strftime('%s', TIME2)) * 1000 * 1000
(substr(TIME1, -6) - substr(TIME2, -6))
) diff_microsec
from time_table;
или:
select abs((strftime('%s', TIME1) - strftime('%s', TIME2)) * 1000 * 1000
(substr(TIME1, instr(TIME1, '.') 1) - substr(TIME2, instr(TIME1, '.') 1))
) diff_microsec
from time_table;
Посмотрите демонстрацию.