Function Postgres(8.0.2.,红移)SQL函数定义,错误“;光标不位于语句内部;

Function Postgres(8.0.2.,红移)SQL函数定义,错误“;光标不位于语句内部;,function,amazon-redshift,function-declaration,Function,Amazon Redshift,Function Declaration,我是postgresql的超级高手。但是我需要定义一个func,它将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; $$

我是postgresql的超级高手。但是我需要定义一个func,它将
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);
但它又回来了

The cursor is not located inside a statement!

您能告诉我我做错了什么吗?

据我从您的函数中了解,您希望将保存为整数类型的值的秒数(即自1970年1月1日UTC 00:00:00以来的秒数)转换为有效类型的值

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

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

据我所知,红移甚至不允许用户定义函数。是的:用户定义的函数和存储过程。所以我觉得你很不走运

搜索红移历元到时间戳或红移
到_timestamp
发现许多其他人已经研究过这一点:

等等

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

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

这就是你看起来已经在做的事情。这是您将得到的最好结果,因为红移不支持用户定义的函数。

您使用的是真正旧的PostgreSQL版本吗?
创建函数
应该失败,因为函数体的格式完全不正确;您编写了一个SQL函数,但声明了它
plpgsql
。您应该得到
错误:键入“datetime”不存在
,如果您解决了这个问题,您应该在“select”或其附近得到
错误:语法错误。我得到了8.0.2。你能给我一个简短的建议它有什么问题吗?8.0.2?哇!是时候升级到不那么史前的东西了。如果你使用的是一个古老的PostgreSQL,你必须在你的问题中提到它,因为答案将假定你能够访问过去十年中引入的特性、函数、语法等。如果您实际使用的是类似红移的叉子,那么更重要的是这样说,因为它们往往会被大量修改。对于函数:PostgreSQL中没有
datetime
数据类型,请使用
timestamp
。声明函数
sql
不是
plpgsql
to_timestamp
内置函数在当前PostgreSQL版本上实现了您想要的功能。谢谢Craig。8.0.2中似乎不存在已编辑的帖子。所以我必须定义我自己的func。@使用8.0.2的AVX是您在提问时提到的东西。这有点像是说“嘿,Chrome不会安装在我的电脑上”,当被问到这台电脑是什么时,你提到它是一台运行Windows95的486。谢谢,Craig。在问题中更新。很酷的类比:)谢谢你这么详细的解释,克雷格!