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)
这只是输出所有条目.
使用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)需要将时间分成两部分,因为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)
Run Code Online (Sandbox Code Playgroud)