【问题标题】:difference in timestamp in sqlitesqlite中时间戳的差异
【发布时间】:2020-10-14 19:41:25
【问题描述】:

我正在尝试在 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 ?有没有办法给出精确的值。

【问题讨论】:

  • 你得到的结果是正确的。前 2 个时间戳之差为 0 毫秒,后 2 个时间戳为 93 毫秒。有什么问题?

标签: python sql database sqlite time


【解决方案1】:

当使用像 julianday() 这样的函数时,SQLite 提供高达毫秒的精度,因为只有前三个数字(点之后)对结果很重要,正如 Date And Time Functions 中提到的那样,所以两个时间字符串 @ 987654324@ 和 14: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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-03
    • 2015-06-27
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 2012-11-28
    • 1970-01-01
    相关资源
    最近更新 更多