to_number()返回错误的信息

时间:2016-02-16 17:22:34

标签: sql postgresql function greenplum

在postgres版本8.2上使用Greenplum:

当我调用此函数时:

CREATE OR REPLACE FUNCTION test_function(_date date)
RETURNS text AS
$BODY$
Declare  
_query text;
_date text;
BEGIN
batch_query := 'select to_number('||_date||', ''9999x99x99'')';
EXECUTE _query into _date;
RETURN _date;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE;

使用此电话:

select test_function('2012-01-15');

我的结果是1996年。我希望结果是20120115(这是我没有破折号输入的日期)

由于这个功能,我如何得到1996年。当我输入其他日期时,我也会获得其他随机“年”。我在这里做错了什么?

1 个答案:

答案 0 :(得分:3)

to_number()将字符串转换为数字(因此名称)。

了解日期。

您正在使用字符串值调用该函数,但该函数被定义为接受date,因此字符串get被转换为date值,然后它被转换为 成一个字符串,因为to_number()需要一个字符串。

然后to_number()函数看到:“2012减1减15” - 产生1996年。

如果您想传递真实日期,那么您正在寻找to_char()函数来设置日期格式。

此外,您不需要PL / pgSQL,也不需要动态SQL:

CREATE OR REPLACE FUNCTION test_function(_date date)
  RETURNS text AS
$BODY$
  select to_char(_date, 'yyyymmdd')';
$BODY$
LANGUAGE sql;

如果您想传递字符串varchartext)值,那么可以使用to_number()函数但是您需要将参数定义为text,以避免邪恶的隐式类型转换。但是你也应该将函数定义为returns numeric,因为这是to_number()返回的内容。否则,您再次获得隐式数据类型转换。

CREATE OR REPLACE FUNCTION test_function(_date text)
  RETURNS numeric AS
$BODY$
  select to_number(_date, '9999x99x99')';
$BODY$
LANGUAGE sql;