首页 > 解决方案 > 如何获取在 MySQL 存储过程中报告的每天注册的额外小时数

问题描述

有一个显示每个用户的入口、午餐时间出口、午餐时间入口和最终出口的出勤报告,我需要显示仅计算 20:30 之后的时间并限制为 21:30 的额外工作时间。

即,如果工人在 20:10 左右报告其退出,则不应计为额外时间。

如果工人在 21:00 左右报告退出,则应计为加时。

如果工人在 21:30 后报告退出,则只能算作 21:30 之前的额外时间。

有下表:

CREATE TABLE `tblassistance` (
`Entrance` datetime NOT NULL,
`LunchExit` datetime DEFAULT NULL,
`LunchEntrance` datetime DEFAULT NULL,
`DayExit` datetime DEFAULT NULL,
`UserID` int(11) NOT NULL);


INSERT INTO tblassistance(Entrance, LunchExit, LunchEntrance, DayExit, UserID) VALUES ('2019-01-05 14:30:00','2019-01-05 15:30:00','2019-01-05 16:30:00','2019-01-05 21:30:00', '1');

INSERT INTO tblassistance(Entrance, LunchExit, LunchEntrance, DayExit, UserID) VALUES ('2019-01-05 14:30:00','2019-01-05 15:30:00','2019-01-05 16:30:00','2019-01-05 21:36:00', '2');

INSERT INTO tblassistance(Entrance, LunchExit, LunchEntrance, DayExit, UserID) VALUES ('2019-01-05 14:30:00','2019-01-05 15:30:00','2019-01-05 16:30:00','2019-01-05 21:00:00', '3');

INSERT INTO tblassistance(Entrance, LunchExit, LunchEntrance, DayExit, UserID) VALUES ('2019-01-05 14:30:00','2019-01-05 15:30:00','2019-01-05 16:30:00','2019-01-05 20:10:00', '4');

报告需要显示从每天 20:30 到 21:30 的每个用户的额外时间。

到目前为止,我已经设法(尝试)绘制以下查询:

(SELECT TIMEDIFF(DATE(tblassistance.DayExit) = CURDATE() && tblassistance.DayExit> (SELECT CONCAT(CURDATE(), ' 21:30:00'))) GROUP BY tblassistance.userID, tblassistance.entrance 

原始报告为存储过程格式,仅接收初始和最终日期,还报告与当前问题无关的天数和其他参数。如果需要它来解决当前问题(获取某个日期报告的 TIMEDIFF() 额外时间量),我可以提供更多详细信息。

标签: mysqlsql

解决方案


试试这个查询:

SELECT 
        UserID, 
        GREATEST(
        "00:00:00", 
         TIMEDIFF( 
                  LEAST( DayExit, DATE_FORMAT( DayExit,  "%Y-%m-%d 21:30:00" ) ) , 
                  DATE_FORMAT( DayExit,  "%Y-%m-%d 20:30:00" ) 
                  ) 
                 )
FROM    `tblassistance` 

推荐阅读