我有一个适用于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)上为客户端安装应用程序,因此我无法在应用程序中更改查询。
答案 0 :(得分:7)
7.4和8.3之间有很多变化。一些最激烈的是删除一些自动演员。
我想“超时”是几秒钟?如果是这样,您可以将查询更改为:
SELECT
*
FROM
login_session
WHERE
(CURRENT_TIMESTAMP - modified) > (timeout * '1 sec'::interval);
答案 1 :(得分:3)
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;
应该这样做。
答案 2 :(得分: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;
(假设超时是以秒为单位测量的 - 否则会相应改变)