我试图在下面的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?有没有一种方法可以赋予精确的价值。
答案 0 :(得分:1)
使用julianday()
之类的函数时,SQLite可以提供毫秒级的精度,因为Date And Time Functions中提到,因为只有前三位(点后)对结果有效。时间字符串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;
请参见demo。