我正在建立一个考勤系统,我将在其中添加员工上下班时间的月度记录。在月底,将创建平均时间和超时。
请告诉我如何将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 ;
这只是输出所有条目。
答案 0 :(得分:5)
使用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 and CONVERT (Transact-SQL)
<强>更新强>
在精确度为time(7)
的情况下计算平均值时,您需要将时间分为两部分,因为datediff
和dateadd
不会处理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)