Как в процедуре корректно сравнивать даты и времени? (PostgreSQL)

#sql #postgresql

#sql #postgresql

Вопрос:

В базе данных PostgreSQL я создаю процедуру, которая выглядит следующим образом:

 CREATE OR REPLACE PROCEDURE tracker(CUSTOM_TIME VARCHAR) AS $FUNCTION$
    BEGIN
        UPDATE SURVEYS SET CONDITION = 3 WHERE CONDITION = 2 AND CUSTOM_TIME > END_PERIOD;
        UPDATE SURVEYS SET BLOCKED = TRUE WHERE CONDITION = 2 AND CUSTOM_TIME BETWEEN START_PERIOD AND END_PERIOD;
    END;
$FUNCTION$ LANGUAGE plpgsql;
  

Когда я пытаюсь запустить эту процедуру, она выдает ошибку.

 CALL tracker('2019-03-29 16:37:00');
  

Ошибка:

 SQL Error [42883]: ERROR: operator does not exist: character varying > timestamp without time zone
No operator matches the given name and argument types. You might need to add explicit type casts.
PL/pgSQL function tracker(character varying) line 3 at SQL statement
  

Где я допускаю ошибку?

Комментарии:

1. «Где я допускаю ошибку?» — Использование varchar для даты / времени. Используйте тип даты / времени like timestamp для параметра custom_time .

2. Я тоже это пробовал. Я меняю тип аргумента на timestamp . Результат тот же, когда я вызываю процедуру. У вас есть какие-нибудь идеи?

Ответ №1:

Попробуйте это..

 CREATE OR REPLACE function tracker(CUSTOM_TIME timestamp without time zone) RETURNS void
AS $FUNCTION$
    BEGIN
        UPDATE SURVEYS SET CONDITION = 3 WHERE CONDITION = 2 AND CUSTOM_TIME > END_PERIOD;
        UPDATE SURVEYS SET BLOCKED = TRUE WHERE CONDITION = 2 AND CUSTOM_TIME BETWEEN START_PERIOD AND END_PERIOD;
    END;
$FUNCTION$
LANGUAGE plpgsql;
  

Комментарии:

1. Здравствуйте! Спасибо! Я использовал эту часть из вашего кода CUSTOM_TIME timestamp without time zone . Я думаю, что в моем случае лучше использовать процедуру вместо функции, потому что я ничего не возвращаю.