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

Ati*_*iaz -4 sql t-sql sql-server

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

请告诉我如何申请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 ;
Run Code Online (Sandbox Code Playgroud)

这只是输出所有条目.

Mik*_*son 5

使用time(7)列计算平均精度为毫秒.

select dateadd(millisecond, avg(datediff(millisecond, onattendance, offattendance)), cast('00:00' as time(7)) )
from t_attendancedetails
Run Code Online (Sandbox Code Playgroud)

该查询用于datediff获取onattendance和之间的毫秒差异offattendance.然后它使用聚合函数avg计算平均差异(以毫秒为单位),最后dateadd用于将平均毫秒数添加到该time(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)
Run Code Online (Sandbox Code Playgroud)