代码之家  ›  专栏  ›  技术社区  ›  Ghaamae

如何获取MySQL存储过程中每天报告的额外小时数

  •  1
  • Ghaamae  · 技术社区  · 6 年前

    有一份显示每个用户的入口、午餐时间出口、午餐时间入口和最终出口的出勤报告,我只需要显示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()额外报告的时间量),我可以提供进一步的细节。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Ass3mbler    6 年前

    尝试这个查询:

    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`