2008-11-14 3 views
4

У меня есть запрос, который работает на Postgresql 7.4, но не на Postgresql 8.3 с той же базой данных.Оператор не существует: interval> integer

Запрос:

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), поэтому я не могу изменять запросы в приложении.

ответ

2
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; 

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

+0

Это является предпочтительным для версии PGSQL, так как он не требует PgSQL. Я также использовал тайминги «multiply vs 1 sec cast» vs 'concatenate to string and cast'. Эта версия (с 1 сек.) На 30% быстрее – reedstrm 2008-11-18 03:54:50

7

Изменения между 7.4 и 8.3 варьируются. Одними из самых решительных были снятие некоторых автоматических бросков.

Я полагаю, что «таймаут» находится в секундах? Если так что вы могли бы изменить запрос:

SELECT 
    * 
FROM 
    login_session 
WHERE 
    (CURRENT_TIMESTAMP - modified) > (timeout * '1 sec'::interval); 
1
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; 

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

+0

отлично работает. Спасибо. – Kostanos 2017-01-04 20:48:27

Смежные вопросы