Расчет среднего значения с точностью до миллисекунды с использованием столбцов time(7)
.
select dateadd(millisecond, avg(datediff(millisecond, onattendance, offattendance)), cast('00:00' as time(7)))
from t_attendancedetails
Запрос использует datediff
, чтобы получить разницу в миллисекундах между onattendance
и offattendance
. Затем он использует агрегированную функцию avg
для вычисления средней разницы в миллисекундах и, наконец, использует dateadd
, чтобы добавить среднее число миллисекунд к значению time(7)
00:00
.
Ref:
DATEDIFF (Transact-SQL)
DATEADD (Transact-SQL)
AVG (Transact-SQL)
CAST and CONVERT (Transact-SQL)
Update:
При расчете среднего значения с точностью time(7)
вам нужно разделить время на две части, потому что datediff
и dateadd
не имеет отношения к bigint
.
Величины разности времени преобразуются в наносекунды до того, как вычисляется среднее значение, а преобразование обратно в time(7)
выполняется в два этапа, сначала секунды, а затем наносекунды.
declare @T0 time(7) = '00:00:00'
declare @G bigint = 1000000000
declare @H bigint = 100
select dateadd(nanosecond, cast(right(T.A, 9) as int), dateadd(second, T.A/@G, @T0))
from
(
select avg(
@G * datediff(second, @T0, offattendance) + @H * right(offattendance, 7) -
@G * datediff(second, @T0, onattendance) + @H * right(onattendance, 7)
)
from t_attendancedetails
) as T(A)
Ваш код не имеет большого смысла. Почему вы не сохраняете timeinat и timeoutat как поля времени? Кроме того, почему вы возвращаете их к тому же типу, который у них уже есть? – JohnFx
чувак, в моей таблице я храню время (7) объект, этот код демонстрирует временную таблицу, в которой я использовал varchar (13). поэтому я хочу только вычислить среднее значение. пожалуйста, предложите. t_attendancedetails таблица содержит объект времени –
нет, я хочу только время, не указанное @MarvinLabs –