2011-08-16 43 views
3

mysql> select * from timing;计算mysql中特定用户的总登录 - 注销时间

+--------------+---------------------+-----------------+ 
| employeeIdNo | employeeLogTime  | employeeLogType | 
+--------------+---------------------+-----------------+ 
|   1 | 2011-08-16 09:53:29 | login   | 
|   1 | 2011-08-16 10:45:42 | logout   | 
|   1 | 2011-08-16 10:55:29 | login   | 
|   1 | 2011-08-16 17:55:39 | logout   | 
+--------------+---------------------+-----------------+ 

我想显示使用上述数据的员工的总工作时间。所以我想要一个MySQL查询来计算employeeIdNo = 1的总时间。我的表名是timing,employeeIdNo是表employee的外键引用。计算后它应该返回totalLogTime值= 7:52:23。请为我提供适当的查询。提前致谢。

+1

你有什么迄今所做?这是个问题! –

+2

如果重构数据以使其处于表单(SessionID,EmployeeID,LoginTime,LogoutTime),那么查询变得非常简单,并且实际上并没有丢失任何数据。 –

+1

用户可以登录两次,也许通过使用第二个客户端开始第二个会话的任何机会?在这种情况下,您将*储存会话ID以便找到正确的登录/注销时间戳对。 –

回答

1

a'r的推荐很有意义。此外,在注销计算时间为每个会话是一个更好的方式 - 虽然这不是严格的标准化,它传播计算的负载....

SELECT ilv.employee, 
SUM(UNIX_TIMESTAMP(logouttime) 
    - IF(logintime IS NULL, 
     UNIX_TIMESTAMP(logouttime), 
     UNIX_TIMESTAMP(logintime))) 
FROM (
    SELECT a.employeeId, a.time AS logouttime, 
    (SELECT MAX(b.time) 
     FROM log b 
     WHERE b.employeeId=a.employeeId 
     AND b.time<a.time 
     AND b.type='login') as logintime 
    FROM log a 
    WHERE a.type='logout' 
    AND a.time BETWEEN <range start> AND <range end> 
    AND employeeId=1 /* optional */ 
) ilv 
GROUP BY ilv.employeeId 
相关问题