MYSQL Условно Всегда Оценивать Остальное - PullRequest
0 голосов
/ 10 апреля 2019

Условное выражение MYSQL, приведенное ниже, trigger всегда вычисляется до оператора ELSE после того, как я проверил, что числа соответствуют ожидаемым. Если я сделаю следующие предположения: NEW.exit_time = '2019-04-09 11:50:00', OLD.enter_time = '2019-04-09 11:00:00' Я ожидаю time_in_minutes = 50, что должно затем SET NEW.total = 25, если plot_minimum_cost = 25. Я проверил, что операторы select, заполняющие plot_minimum_cost и plot_minute_cost, точны, учитывая, что plot_max_cost работает правильно и использует ту же логику для извлечения. Чего мне не хватает?

DROP TRIGGER IF EXISTS get_total_parking_cost;
DELIMITER $$
CREATE TRIGGER get_total_parking_cost BEFORE UPDATE
ON records
FOR EACH ROW
BEGIN
    DECLARE plot_minimum_cost DOUBLE;
    DECLARE plot_max_cost DOUBLE;
    DECLARE plot_minute_cost DOUBLE;
    DECLARE time_in_lot DATETIME;
    DECLARE time_in_minutes DOUBLE;

    SELECT parking_lots.min_cost INTO plot_minimum_cost
    FROM parking_lots
    WHERE parking_lots.id = OLD.parking_id;

    SELECT parking_lots.max_cost INTO plot_max_cost
    FROM parking_lots
    WHERE parking_lots.id = OLD.parking_id;

    SELECT parking_lots.minutely_cost INTO plot_minute_cost
    FROM parking_lots
    WHERE parking_lots.id = OLD.parking_id;

    SET @time_in_lot = TIMEDIFF(NEW.exit_time, OLD.enter_time);

    SET @time_in_minutes = (HOUR(time_in_lot) * 60) + MINUTE(time_in_lot);

    IF @time_in_minutes <= 60 THEN
        SET NEW.total = plot_minimum_cost;

    ELSEIF @time_in_minutes <= 300 THEN
        SET NEW.total = time_in_minutes * plot_minute_cost;

    ELSE
        SET NEW.total = plot_max_cost;
    END IF;  

END$$
DELIMITER ;

1 Ответ

0 голосов
/ 11 апреля 2019

Вы объявили локальную переменную time_in_lot и используете ее в (HOUR(time_in_lot) * 60) + MINUTE(time_in_lot);но вы на самом деле никогда не устанавливаете это.Вы устанавливаете @time_in_lot, который является переменной сеанса.Точно так же вы устанавливаете @time_in_minutes, даже если вы объявили time_in_minutes;но в этом случае вы используете версию @ для условий IF.

В основном удалите все экземпляры символа @ из триггера и посмотрите, исправляет ли это.

...