sqlite时间戳差异

时间:2020-10-14 19:41:25

标签: python sql database sqlite time

我试图在下面的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 个答案:

答案 0 :(得分:1)

使用julianday()之类的函数时,SQLite可以提供毫秒级的精度,因为Date And Time Functions中提到,因为只有前三位(点后)对结果有效。时间字符串14:14:04.44625814:14:04.446377都被评估为14:14:04.446并被认为是相等的。

因此,以毫秒为单位的结果是正确的。

如果要以微秒为单位,则应将2次的最后3位数字相加:

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;

请参见demo