时差的计算可以分为总小时数和剩余的分钟和秒数。
示例代码段:
-- Using a table variable for demonstration purposes
declare @EmployeeAttendance table (ID int identity(1,1) primary key, EmpCode int, AttendanceTimeIn datetime, AttendanceTimeOut datetime);
-- Simplified sample data
insert into @EmployeeAttendance (EmpCode, AttendanceTimeIn, AttendanceTimeOut) values
(11,'2018-08-01 09:20:00', null)
,(11,null, '2018-08-01 21:35:15')
,(12,'2018-08-01 09:00:00', null)
,(12,null, '2018-08-01 22:20:20')
,(13,'2018-08-01 09:00:00',null)
,(13,'2018-08-01 12:00:00',null)
;
-- The query
WITH EMPLOYEEATTENDANCE AS
(
select
EmpCode,
cast(coalesce(AttendanceTimeIn, AttendanceTimeOut) as date) as AttendanceDate,
cast(min(AttendanceTimeIn) as time) as MinEmpTimeIn,
cast(max(AttendanceTimeIn) as time) as MaxEmpTimeIn,
cast(max(AttendanceTimeOut) as time) as MaxEmpTimeOut
--,max(cast(max(AttendanceTimeOut) as time)) over (partition by cast(coalesce(AttendanceTimeIn, AttendanceTimeOut) as date)) as MaxDateTimeOut
from @EmployeeAttendance
where cast(coalesce(AttendanceTimeIn, AttendanceTimeOut) as date) between cast('2018-08-01' as date) and cast('2018-08-01' as date)
group by EmpCode, cast(coalesce(AttendanceTimeIn, AttendanceTimeOut) as date)
)
SELECT
CONCAT(SUM(DATEDIFF(HOUR,MinEmpTimeIn, coalesce(MaxEmpTimeOut,MaxEmpTimeIn))),
SUBSTRING(CONVERT(varchar(30),
DATEADD(ms,(SUM(DATEDIFF(SECOND,MinEmpTimeIn, coalesce(MaxEmpTimeOut,MaxEmpTimeIn)))%3600)*1000,0)
,114),3,6)) as TotalTimeDiff
FROM EMPLOYEEATTENDANCE;
TotalTimeDiff
-------------
28:35:35
但在你的样本数据中,只有1个EmpCode的1个AttendanceTimeOut。
如果数据不完整,则预期结果不完整。