获取SQL Server中员工工作班次的开始时间和结束时间

时间:2017-08-01 09:12:42

标签: sql sql-server

我有一张包含员工出勤时钟的表格,其结构如下:

注意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

2 个答案:

答案 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