繁体   English   中英

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

[英]calculate total login logout time in 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 的总时间。 我的表名是时间,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)

它给了我空集,如上图所示。

你不能为单个用户总结所有时间:

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

并返回 B - A;

作为一种查看方式,这有点不合时宜,但提供了更简单的 sql 查询。 您还需要使用此方法检查登录和注销的出现次数是否相同。

检查显示

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
;
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;

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

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM