Оператор не существует: интервал> целое число - PullRequest
5 голосов
/ 14 ноября 2008

У меня есть запрос, который работает на Postgresql 7.4, но не на Postgresql 8.3 с той же базой данных.

Запрос:

SELECT * FROM login_session WHERE (now()-modified) > timeout;

Получает следующую ошибку:

ERROR:  operator does not exist: interval > integer
LINE 1: ...ELECT * FROM login_session WHERE (now()-modified) > timeout ...
                                                             ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

Столбец modified представляет собой timestamp, а timeout представляет собой integer.

Есть ли какие-то настройки, которые мне нужно изменить на сервере?

Я устанавливаю приложение для клиента на новый сервер (Ubuntu), поэтому я не могу изменить запросы в приложении.

Ответы [ 3 ]

7 голосов
/ 14 ноября 2008

Есть много изменений между 7.4 и 8.3. Некоторыми из самых радикальных явилось удаление некоторых автоматических приведений.

Я полагаю, "тайм-аут" в секундах? Если это так, вы можете изменить запрос на:

SELECT
    *
FROM
    login_session
WHERE
    (CURRENT_TIMESTAMP - modified) > (timeout * '1 sec'::interval);
3 голосов
/ 14 ноября 2008
create or replace function int2interval (x integer) returns interval as $$ select $1*'1 sec'::interval $$ language sql;
create cast (integer as interval) with function int2interval (integer) as implicit;

должен это сделать.

1 голос
/ 14 ноября 2008
CREATE OR REPLACE FUNCTION intToInterval(arg integer)
  RETURNS interval AS
$BODY$
   BEGIN      
      return CAST( arg || ' seconds' AS interval ); 
   END;
$BODY$
  LANGUAGE 'plpgsql';

CREATE CAST (integer AS interval)
WITH FUNCTION intToInterval ( integer )
AS IMPLICIT;

(Предполагается, что время ожидания измеряется в секундах - измените соответственно в противном случае)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...