如何在sqlite上获取时间平均值
how to get the time average on sqlite
我在 SQLite 中有一个 table,其中有 3 列 time、scramble 和 datetime。
我需要计算 time 列的平均值,它的格式符合 SQLite 的文档,关于 日期和时间数据是00:00:00.000 %H%M%f
如果我使用 min 或 max 函数
select min(time) from records.
要么
select max(time) from records.
returns 一个正确的值。
但如果我使用
select avg(time) from records.
它returns 0.0
我读过它,AVG 函数的文档说没有 TEXT 有效
数据格式,我已经以编程方式完成,但我想知道是否存在针对此的函数或查询。
TFYT.
首先,您必须使用 strftime('%s', time)
获取 unix 纪元时间(自 1970-01-01
以来的秒数),然后乘以 1000 并加上毫秒数。
结果为整数,可取平均值
这个平均值是一个浮点数,必须除以 1000 并转换为整数,以便可以使用 time()
函数将其转换回 TIME
:
SELECT time(
CAST(AVG(strftime('%s', time) * 1000 + SUBSTR(time, -3)) / 1000 AS INTEGER),
'unixepoch'
)
FROM records
实际上在计算中使用毫秒并不能获得更高的准确度,所以分别取毫秒的平均值并连接:
SELECT time(AVG(strftime('%s', time)), 'unixepoch') || '.' ||
printf('%03d', AVG(SUBSTR(time, -3))) average_time
FROM records
为了更准确,试试这个:
WITH cte AS (
SELECT AVG(strftime('%s', time) * 1000 + SUBSTR(time, -3)) avg_seconds
FROM records
)
SELECT time(CAST(avg_seconds / 1000 AS INTEGER), 'unixepoch')
|| '.' ||
printf('%03d', ROUND(avg_seconds) % 1000) average_time
FROM cte
查看简化版 demo。
我在 SQLite 中有一个 table,其中有 3 列 time、scramble 和 datetime。
我需要计算 time 列的平均值,它的格式符合 SQLite 的文档,关于 日期和时间数据是00:00:00.000 %H%M%f
如果我使用 min 或 max 函数
select min(time) from records.
要么
select max(time) from records.
returns 一个正确的值。
但如果我使用
select avg(time) from records.
它returns 0.0
我读过它,AVG 函数的文档说没有 TEXT 有效
数据格式,我已经以编程方式完成,但我想知道是否存在针对此的函数或查询。
TFYT.
首先,您必须使用 strftime('%s', time)
获取 unix 纪元时间(自 1970-01-01
以来的秒数),然后乘以 1000 并加上毫秒数。
结果为整数,可取平均值
这个平均值是一个浮点数,必须除以 1000 并转换为整数,以便可以使用 time()
函数将其转换回 TIME
:
SELECT time(
CAST(AVG(strftime('%s', time) * 1000 + SUBSTR(time, -3)) / 1000 AS INTEGER),
'unixepoch'
)
FROM records
实际上在计算中使用毫秒并不能获得更高的准确度,所以分别取毫秒的平均值并连接:
SELECT time(AVG(strftime('%s', time)), 'unixepoch') || '.' ||
printf('%03d', AVG(SUBSTR(time, -3))) average_time
FROM records
为了更准确,试试这个:
WITH cte AS (
SELECT AVG(strftime('%s', time) * 1000 + SUBSTR(time, -3)) avg_seconds
FROM records
)
SELECT time(CAST(avg_seconds / 1000 AS INTEGER), 'unixepoch')
|| '.' ||
printf('%03d', ROUND(avg_seconds) % 1000) average_time
FROM cte
查看简化版 demo。