在SQL中计算时间平均值(7)

时间:2013-01-31 07:29:06

标签: sql sql-server tsql

我正在建立一个考勤系统,我将在其中添加员工上下班时间的月度记录。在月底,将创建平均时间和超时。

请告诉我如何将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 ;

这只是输出所有条目。

1 个答案:

答案 0 :(得分:5)

使用time(7)列以毫秒精度计算平均值。

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

该查询使用datediff来获取onattendanceoffattendance之间的差异(以毫秒为单位)。然后,它使用聚合函数avg计算平均差异(以毫秒为单位),最后使用dateadd将平均毫秒数添加到time(7)00:00

价:
DATEDIFF (Transact-SQL)
DATEADD (Transact-SQL)
AVG (Transact-SQL)
CAST and 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)