разница во временной метке в sqlite

#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;
  

Посмотрите демонстрацию.