Функция, которая рассчитывает отпуск для работника в часах - PullRequest
0 голосов
/ 22 октября 2019

Мне нужно написать функцию, которая будет вычислять отпуск, но в часах, а не в днях. Я уже написал функции для подсчета в днях. Поэтому я пытался перестроить его в течение нескольких часов, но у меня не получилось ...

Каждый сотрудник постоянно информирует о том, как долго он работает в день в столбце в БД, также я сохраняю даты выходных в БД, поэтому я использовал 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...