USE `vn`; DROP procedure IF EXISTS `timeControl_calculate`; DELIMITER $$ USE `vn`$$ CREATE DEFINER=`root`@`%` PROCEDURE `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 FROM (SELECT SUM(timeWork) timeWork, userFk, dated 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.userFk, wtc.timed timed, direction FROM (SELECT * FROM workerTimeControl ORDER BY userFk, timed ASC) wtc JOIN tmp.`user` w ON w.userFk = wtc.userFk WHERE wtc.timed BETWEEN vDatedFrom AND vDatedTo ORDER BY userFk, timed ASC ) sub GROUP BY userFk, dated ORDER BY userFk, dated )sub2; END$$ DELIMITER ;