SQL查询可通过一次查询获得总工作时间和加班时间-生成包含所有用户数据的结果集

时间:2018-09-22 16:18:59

标签: mysql

我正在尝试获取给定时间段内所有用户的总时数和总加班时间。我设法建立了一个查询,该查询将给出所需的结果,但对于仅由id决定的特定用户。

SELECT 
    navn AS name, 
    hour AS hoursTotal, 
    overTime as overtimeTotal 
FROM ( 
    SELECT SUM(TIMESTAMPDIFF(SECOND, starttid, sluttid)) AS hour
    FROM hours 
    WHERE hours.user_id = 14 
    AND DATE(starttid) BETWEEN '2018-8-25' AND '2018-9-25'
    ) AS T,
    (
    SELECT SUM( IF( TIMESTAMPDIFF(SECOND, starttid, sluttid) >= TIME_TO_SEC('07:24:00:0000') , TIMESTAMPDIFF(SECOND, starttid, sluttid) - TIME_TO_SEC('07:24:00:0000') , 0 ) ) AS overTime
    FROM hours 
    WHERE user_id = 14 
    AND DATE(starttid) BETWEEN '2018-8-25' AND '2018-9-25' 
    ) AS O,
    (
    SELECT name AS navn 
    FROM users
    WHERE users.id = 14 
    ) AS F

这给了我

name       | hoursTotal  | overtimeTotal
John Doe   | 245700      | 85860

John Doe具有user.id 14

我无法全力以赴,但是对于2018-8-25至2018-9-25期间的所有用户

所需结果:

name       | hoursTotal  | overtimeTotal
John Doe   | 245700      | 85860
Jane Doe   | 354664      | 78243
Tarzan     | 203111      | 0
Batman     | 100233      | 0

我希望有人可以在这里向正确的方向提供帮助。

1 个答案:

答案 0 :(得分:1)

是否可能需要加和并通过join进行分组

    SELECT users.name AS name, 
        SUM(TIMESTAMPDIFF(SECOND, starttid, sluttid)) AS hoursTotal, 
        SUM( IF( TIMESTAMPDIFF(SECOND, starttid, sluttid) >= TIME_TO_SEC('07:24:00:0000') , TIMESTAMPDIFF(SECOND, starttid, sluttid) - TIME_TO_SEC('07:24:00:0000') , 0 ) ) as overtimeTotal 
        FROM hours 
        INNER JOIN users on hours.user_id = users.id
        WHERE DATE(starttid) BETWEEN '2018-8-25' AND '2018-9-25'
    group by users.name