-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之间的毫秒数差异。然后它使用聚合函数来计算以毫秒为单位的平均差异,最后它使用将平均毫秒数添加到value中。onattendanceoffattendanceavgdateaddtime(7)00:00

参考:
DATEDIFF (Transact-SQL)
DATEADD (Transact-SQL)
AVG (Transact-SQL)
CAST 和 CONVERT (Transact-SQL)

更新:

当计算精度为 的平均值时,time(7)您需要将时间分成两部分,因为datediffdateadd处理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)
于 2013-01-31T09:10:58.870 回答