我有一张包含员工出勤时钟的表格,其结构如下:
注意InOut
0表示时钟输入,1表示时钟输出。
EmployeeID LogDate LogTime TerminalID InOut
150157 1/1/2017 15:44:44 50054 0
150157 1/1/2017 19:53:01 50054 1
150157 1/1/2017 19:53:12 50054 1
150157 1/2/2017 10:40:59 50039 0
150157 1/2/2017 15:59:23 50058 0
150157 1/2/2017 21:01:50 50058 1
我需要的是每天获得工作班次的开始时间和结束时间。根据表中的数据,结果应为
Date Start End Total Hours
1/1/2017 15:44 19:53 4:09
1/2/2017 10:40 21:01 10:21
答案 0 :(得分:1)
这将以分钟为单位为您提供登录时间,查找如何将分钟转换为HH:MM:SS。如果员工在每个日期都没有登录和注销,你也会遇到麻烦。
SELECT
EmployeeID
, LogDate
, MIN(CASE WHEN inout = 0 THEN LogTime ELSE NULL END) AS Start
, MAX(CASE WHEN InOut = 1 THEN LogTime ELSE NULL END) AS End
, DATEDIFF(n, MIN(CASE WHEN inout = 0 THEN LogTime ELSE NULL END), MAX(CASE WHEN InOut = 1 THEN LogTime ELSE NULL END))
GROUP BY
EmployeeID, LogDate
答案 1 :(得分:0)
这是Alexey R的逻辑实现。请注意,虽然它符合您的示例结果,但您绝不想在商业上使用它,因为它无法应对您的破坏数据。它需要任何员工在任何地方登录的第一个实例,并使其成为当天的第一个登录。它对任何emp,任何终端的最后一次注销都是一样的。如果没有首次登录/最后一次登出,则分别在00:00和23:59之间。然后,它将工作班次定义为两次之间的差异。危险的危险:无法保证任何人都做了报告的工作时间:
SELECT
LogDate,
CONCAT(DATEDIFF(minute, firstlogin, lastlogout)/60, ':',DATEDIFF(minute, firstlogin, lastlogout)% 60) as total_hours
FROM
(
SELECT
LogDate,
CONVERT(datetime, COALESCE(MIN(CASE WHEN InOut = 0 THEN LogTime END), '00:00:00'), 108) as FirstLogin,
CONVERT(datetime, COALESCE(MAX(CASE WHEN InOut = 1 THEN LogTime END), '23:59:59'), 108) as LastLogout
FROM table
GROUP BY logdate
) a