列を使用してミリ秒の精度で平均を計算し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
参照:
DATEDIFF (Transact-SQL)
DATEADD (Transact-SQL)
AVG (Transact-SQL)
CAST および CONVERT (Transact-SQL)
アップデート:
の精度で平均を計算する場合はtime(7)
、時間を 2 つの部分に分割する必要がdatediff
ありdateadd
ますbigint
。
時間差の値は、平均が計算される前にナノ秒に変換されtime(7)
、最初に秒、次にナノ秒の 2 つのステップで変換が行われます。
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)