计算mysql中的总登录注销时间

时间:2011-08-16 11:00:20

标签: java mysql

mysql> select * from timing;

+--------------+---------------------+-----------------+
| employeeIdNo | employeeLogTime     | employeeLogType |
+--------------+---------------------+-----------------+
|            1 | 2011-08-16 14:59:08 | login           |
|            1 | 2011-08-16 15:00:06 | logout          |
|            1 | 2011-08-16 15:14:51 | login           |
|            2 | 2011-08-16 15:15:00 | login           |
|            1 | 2011-08-16 15:59:01 | logout          |
|            2 | 2011-08-16 15:59:09 | logout          |
+--------------+---------------------+-----------------+

我想显示使用上述数据的员工的总工作时间。所以我想要一个mysql查询来计算(比方说)employeeIdNo = 1的总时间。我的表名是timing,employeeIdNo是表employee的外键引用。在计算之后它应该返回totalLogTime值= 00:45:52(这是大约值,我没有完全计算它)。请提供适当的查询。提前谢谢。

我尝试了这个查询。: -

mysql> SELECT 
  TIMEDIFF(FIRSTTIME.employeeLogTime,SECONDTIME.employeeLogTime) 
  FROM (
    (SELECT * FROM timing HAVING employeeLogTime = max(employeeLogTime)) as FIRSTTIME,     
    (SELECT * FROM timing ORDER BY employeeLogTime LIMIT 1,1) as SECONDTIME);
Empty set (0.01 sec)

它给我空集如上所示。

4 个答案:

答案 0 :(得分:3)

无法为单个用户总结所有时间:

  • 用于登录(以毫秒为单位)调用此A
  • 用于注销(以毫秒为单位)调用此B

并返回B - A;

作为一种查看它的方式有点尴尬,但提供了更简单的SQL查询。 您还需要使用此方法检查登录和注销是否具有相同的出现次数。

答案 1 :(得分:0)

通过将employeeLogType更改为login并将1更改为logout来修改0列。 该表格如下:

mysql> select * from timing;
+--------------+---------------------+-----------------+
| employeeIdNo | employeeLogTime     | employeeLogType |
+--------------+---------------------+-----------------+
|            1 | 2011-08-16 14:59:08 | 1               |
|            1 | 2011-08-16 15:00:06 | 0               |
|            1 | 2011-08-16 15:14:51 | 1               |
|            2 | 2011-08-16 15:15:00 | 1               |
|            1 | 2011-08-16 15:59:01 | 0               |
|            2 | 2011-08-16 15:59:09 | 0               |
+--------------+---------------------+-----------------+

查询以显示所有员工的总时间:

mysql> SELECT employeeIdNo, time(sum(employeeLogTime*(1-2*`employeeLogType`)))
FROM timing GROUP BY employeeIdNo;

查询以显示特定员工的总时间:

mysql> SELECT employeeIdNo, time(sum(employeeLogTime*(1-2*`employeeLogType`)))
FROM timing where employeeIdNo=(employeeIdNo) GROUP BY employeeIdNo;

答案 2 :(得分:0)

检查dis

SELECT employeeIdNo ,sec_to_time(SUM(TIME))  FROM
(
    SELECT 
        TO_SECONDS(employeeLogTime     ) * -1 AS TIME
    FROM connection
    WHERE employeeLogType = 1
    UNION
    SELECT 
        TO_SECONDS(employeeLogTime     ) * 1  AS TIME
    FROM connection
    WHERE employeeLogType = 0
) t
;

答案 3 :(得分:0)

select employeeIdNo,
sum(loginTimeInSec) as loginTimeInSec
from(
    select 
        e1.employeeIdNo, 
        TIME_TO_SEC(TIMEDIFF(e2.employeeLogTime,e1.employeeLogTime)) as loginTimeInSec
    from 
       timing e1 join timing e2
       on e1.employeeIdNo = e2.employeeIdNo
       and e1.employeeLogType = 'login'
       and e2.employeeLogType = 'logout'
       and e1.employeeLogTime < e2.employeeLogTime
       group by e1.id having min(e2.employeeLogTime - e1.employeeLogTime)
) temp
group by employeeIdNo;