DROP PROCEDURE IF EXISTS `vn`.`timeControl_calculate`; DELIMITER $$ CREATE DEFINER=`root`@`%` PROCEDURE `vn`.`timeControl_calculate`(vDatedFrom DATETIME, vDatedTo DATETIME) BEGIN SET @vIsOdd := TRUE; SET @vUser := NULL; SET @vDated := NULL; DROP TEMPORARY TABLE IF EXISTS tmp.timeControlCalculate; CREATE TEMPORARY TABLE tmp.timeControlCalculate SELECT userFk, dated, IF( timeWork >= 18000, @timeWork:=timeWork + 1200, @timeWork:=timeWork) timeWorkSeconds, SEC_TO_TIME(@timeWork ) timeWorkSexagesimal, @timeWork / 3600 timeWorkDecimal, timed FROM (SELECT SUM(timeWork) timeWork, userFk, dated, GROUP_CONCAT(DATE_FORMAT(sub.timed,"%H:%i") ORDER BY sub.timed ASC SEPARATOR ' - ') timed FROM (SELECT IF(@vUser = wtc.userFk, @vUser :=@vUser, @vUser := wtc.userFk), IF(@vIsOdd, @vIsOdd := FALSE, @vIsOdd := TRUE), IF(direction='in', @vIsOdd := TRUE, @vIsOdd := @vIsOdd), IF(@vIsOdd, @vLastTimed:=UNIX_TIMESTAMP(timed),@vLastTimed:=@vLastTimed), IF(@vIsOdd, 0, UNIX_TIMESTAMP(timed)-@vLastTimed) timeWork, IF(direction='in', @vDated := DATE(wtc.timed), @vDated :=@vDated) dated, wtc.timed timed, wtc.userFk, direction FROM (SELECT DISTINCT(wtc.id), wtc.userFk, wtc.timed, wtc.direction FROM workerTimeControl wtc JOIN tmp.`user` w ON w.userFk = wtc.userFk WHERE wtc.timed BETWEEN vDatedFrom AND vDatedTo ORDER BY userFk, timed ASC ) wtc WHERE wtc.timed BETWEEN vDatedFrom AND vDatedTo ) sub GROUP BY userFk, dated )sub2; END$$ DELIMITER ;