MySQL出勤率计算

时间:2019-04-25 04:50:59

标签: mysql sql

我在这里有桌游

enter image description here

我需要如下所示的结果

enter image description here

我如何在不使用任何编程语言的情况下在mysql中实现这一目标

Sql文件为Attendances.sql

2 个答案:

答案 0 :(得分:2)

我们可以尝试按用户和日期进行汇总的数据透视查询方法:

SELECT
    user_id,
    DATE(date_time) AS date,
    TIMESTAMPDIFF(MINUTE,
                  MAX(CASE WHEN status = 'IN' THEN date_time END),
                  MAX(CASE WHEN status = 'OUT' THEN date_time END)) / 60.0 AS hours
FROM yourTable
GROUP BY
    user_id,
    DATE(date_time);

这个答案的警告很多。假定每个用户每天只有一个INOUT条目。如果一个时期可以跨越日期,那么我的答案可能不会产生正确的结果。另外,如果缺少INOUT值,则将报告NULL值的hours

答案 1 :(得分:0)

我已经通过创建mysql函数和视图来实现自我

Mysql视图

CREATE OR REPLACE VIEW `view_attendances` AS
    SELECT 
        `a`.`id` AS `a1_id`,
        `a`.`user_id` AS `user_id`,
        CAST(`a`.`date_time` AS DATE) AS `date`,
        `a`.`date_time` AS `in`,
        `a2`.`id` AS `a2_id`,
        `a2`.`date_time` AS `out`,
        (TIMESTAMPDIFF(SECOND,
            `a`.`date_time`,
            `a2`.`date_time`) / 3600) AS `hours`
    FROM
        (`attendances` `a`
        JOIN `attendances` `a2` ON (((`a`.`is_confirm` = 1)
            AND (`a`.`status` = 'IN')
            AND (`a2`.`id` = FN_NEXT_OUT_ATTENDANCE_ID(`a`.`user_id`, `a`.`date_time`, `a`.`status`))
            AND (a2.status = 'OUT')
            AND (CAST(`a`.`date_time` AS DATE) = CAST(`a2`.`date_time` AS DATE)))))

Mysql函数

CREATE FUNCTION `fn_next_out_attendance_id`( _user_id INT, _attendance_date_time DATETIME, _status VARCHAR(10) ) RETURNS int(11) 
BEGIN
   DECLARE _id INT(11);
SELECT
   id INTO _id 
FROM
   attendances 
WHERE
   is_confirm = 1 
   AND user_id = _user_id 
   AND date_time > _attendance_date_time 
   AND `status` <> _status 
ORDER BY
   date_time ASC LIMIT 1 ;
RETURN if (_id IS NULL, 0, _id);
END