为了账号安全,请及时绑定邮箱和手机立即绑定

sqlite中时间戳的差异

sqlite中时间戳的差异

PHP
POPMUISE 2023-11-09 17:06:40
我试图找出 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 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

当使用类似的函数时,SQLite 提供高达毫秒的精度julianday(),因为只有前三位数字(点后)对结果很重要,正如日期和时间函数中提到的那样,因此时间字符串14:14:04.446258和都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;

请参阅演示



查看完整回答
反对 回复 2023-11-09
  • 1 回答
  • 0 关注
  • 177 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信