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 timestamp 或 redshift to_timestamp
发现很多其他人已经研究过这个:
- http://yiyujia.blogspot.com.au/2014/04/redshift-convert-integer-to-timestamp.html
- http://www.valkrysa.com/tech/2015/1/30/amazon-redshift-converting-unix-epoch-time-into-timestamps
等等
最明智的答案是那些依赖于:
TIMESTAMP 'epoch' + myunixtime * INTERVAL '1 Second '
这似乎是您已经在做的事情。这是您将获得的最好结果,因为 Redshift 不支持用户定义的函数。
我是 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 timestamp 或 redshift to_timestamp
发现很多其他人已经研究过这个:
- http://yiyujia.blogspot.com.au/2014/04/redshift-convert-integer-to-timestamp.html
- http://www.valkrysa.com/tech/2015/1/30/amazon-redshift-converting-unix-epoch-time-into-timestamps
等等
最明智的答案是那些依赖于:
TIMESTAMP 'epoch' + myunixtime * INTERVAL '1 Second '
这似乎是您已经在做的事情。这是您将获得的最好结果,因为 Redshift 不支持用户定义的函数。