-4

従業員の出勤と退勤の月次記録を追加する勤怠システムを作成しています。月末に平均出勤時間と退勤時間が作成されます。

avg()のデータ型に適用する方法を教えてくださいtime(7)

declare @tblPK table
(
    timeinat varchar(13) not null,
    timeoutat varchar(13) not null
) ;

insert into @tblPK 
select cast((onattendance) as varchar(13))ONTime, 
       cast((offattendance) as varchar(13))OFFTime 
from t_attendancedetails ;

select * from @tblPK ;

これは、すべてのエントリの出力のみを提供しています。

4

1 に答える 1

5

列を使用してミリ秒の精度で平均を計算しtime(7)ます。

select dateadd(millisecond, avg(datediff(millisecond, onattendance, offattendance)), cast('00:00' as time(7)) )
from t_attendancedetails

クエリは、とdatediffの間のミリ秒単位の差を取得するために使用します。次に、集計関数を使用してミリ秒単位の平均差を計算し、最後に を使用して平均ミリ秒数を値に追加します。onattendanceoffattendanceavgdateaddtime(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)
于 2013-01-31T09:10:58.870 に答える