Мне нужно написать функцию, которая будет вычислять отпуск, но в часах, а не в днях. Я уже написал функции для подсчета в днях. Поэтому я пытался перестроить его в течение нескольких часов, но у меня не получилось ...
Каждый сотрудник постоянно информирует о том, как долго он работает в день в столбце в БД, также я сохраняю даты выходных в БД, поэтому я использовал 2 курсора для полученияданные из 2 таблиц.
Когда я пытался опубликовать эту функцию, я просто потерял соединение с БД (соединение установлено, я проверял его много раз), так как пользователи все еще работают на БД с помощью приложения, поэтому невозможно потерятьсвязь. У меня нет других ошибок при применении скрипта ..
CREATE DEFINER=`mrzewnicki`@`10.134.43.32` FUNCTION `CRM_VACATIONS_HOURS`(Date_a DATETIME, Date_b DATETIME, employeeid int) RETURNS time
BEGIN
declare summary_time time;
DECLARE PolHoliday date;
DECLARE PolHolidays varchar(5000);
DECLARE Date_between DATE;
DECLARE finished int; #holidays finisher
DECLARE finish int; #working hours finisher
DECLARE work_time time;
Declare work_times time;
#zapytanie po czas pracy pracownika
DECLARE employeeWorkingTime CURSOR FOR
SELECT employee_working_hours from vtiger_ossemployees
where ossemployeesid = employeeid;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finish = 1;
Begin
#zapytanie po dni świąteczne
DECLARE cursorPolHoliday CURSOR FOR
SELECT holidaydate from vtiger_publicholiday
ORDER BY holidaydate;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
SET summary_time = '00:00:00';
SET Date_between = date_form(Date_a,'%Y-%m-%d');
SET PolHolidays = ';';
OPEN employeeWorkingTime;
getWorkingHours: Loop
Fetch employeeWorkingTime into work_time;
if finish = 1 then leave getWorkingHours;
end if ;
set work_times = work_time;
end Loop getWorkingHours;
CLOSE employeeWorkingTime;
IF (date_form(Date_a,'%Y-%m-%d') > date_form(Date_b,'%Y-%m-%d')) THEN SET summary_time = '00:00:00';
ELSEIF (date_format(Date_a,'%Y-%m-%d') = date_format(Date_b,'%Y-%m-%d')) THEN SET summary_time = timediff(Date_b, Date_a);
ELSE
OPEN cursorPolHoliday;
loopPolHoliday: LOOP
FETCH cursorPolHoliday INTO PolHoliday;
IF finished = 1 THEN
LEAVE loopPolHoliday;
END IF;
SET PolHolidays = CONCAT(PolHolidays, DATE_FORMAT(PolHoliday,'%Y-%m-%d'), ';') ;
END LOOP loopPolHoliday;
CLOSE cursorPolHoliday;
WHILE (date_format(Date_between,'%Y-%m-%d')<=date_format(Date_b,'%Y-%m-%d')) DO
IF( (dayofweek(Date_between) not in (6,7)) and (INSTR(PolHolidays,CONCAT(';',DATE_FORMAT(Date_between,'%Y-%m-%d'),';'))=0) )
THEN SET summary_time = ADDTIME(summary_time, work_times);
END IF;
SET Date_between = Date_between;
End while;
END IF;
SET summary_time = SUBTIME(summary_time,080000);
RETURN summary_time;
END;
END;