Postgres (8.0.2., Redshift) SQL 函数定义,错误 "The cursor is not located inside a statement"

Postgres (8.0.2., Redshift) SQL function definition, error "The cursor is not located inside a statement"

我是 postgresql 的超级菜鸟。但是我需要定义一个 map: int --> datetime 的函数 阅读文档后,我想出了这个:

 CREATE FUNCTION fut(num integer) RETURNS datetime
 -- convert a UNIX time integer into the datetime timestamp
    AS $$ select timestamp 'epoch'+interval '1 second'*num; $$
    LANGUAGE plpgsql;

select fut(500);

但是 returns

The cursor is not located inside a statement!

你能指出我在这里做错了什么吗?

据我了解你的功能,你想转换 unix time (i.e., the number of seconds since 00:00:00 UTC, 1 January 1970) saved as a value of integer type, to a value of valid postgresql date/time 类型。

如果是这样,您不必为这种转换创建新函数,只需使用预定义的 postgresql 函数 to_timestamp,例如:

# select to_timestamp(500);
to_timestamp      
------------------------
 1970-01-01 03:08:20+03
(1 row)

据我所知,Redshift 甚至不允许用户定义函数。是的:http://docs.aws.amazon.com/redshift/latest/dg/c_unsupported-postgresql-features.html用户定义的函数和存储过程。所以我认为你很不走运。

搜索 Redshift epoch to timestampredshift to_timestamp 发现很多其他人已经研究过这个:

等等

最明智的答案是那些依赖于:

TIMESTAMP 'epoch' + myunixtime * INTERVAL '1 Second '

这似乎是您已经在做的事情。这是您将获得的最好结果,因为 Redshift 不支持用户定义的函数。