to_number() 返回错误信息
to_number() returning wrong information
在 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 年的。当我输入其他日期时,我也会得到其他随机 "years"。我在这里做错了什么?
to_number()
将字符串转换为数字(因此得名)。
它不知道任何关于日期的事情。
您正在用一个字符串值调用该函数,但该函数被定义为接受一个 date
,因此该字符串被转换为一个 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;
如果你想传递一个 string (varchar
, text
) 值那么你 可以 使用to_number()
函数,但您需要将参数定义为 text
以避免邪恶的隐式类型转换。但是您还应该将函数定义为 returns numeric
,因为这就是 to_number()
returns。否则,您将再次 获得隐式数据类型转换。
CREATE OR REPLACE FUNCTION test_function(_date text)
RETURNS numeric AS
$BODY$
select to_number(_date, '9999x99x99')';
$BODY$
LANGUAGE sql;
在 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 年的。当我输入其他日期时,我也会得到其他随机 "years"。我在这里做错了什么?
to_number()
将字符串转换为数字(因此得名)。
它不知道任何关于日期的事情。
您正在用一个字符串值调用该函数,但该函数被定义为接受一个 date
,因此该字符串被转换为一个 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;
如果你想传递一个 string (varchar
, text
) 值那么你 可以 使用to_number()
函数,但您需要将参数定义为 text
以避免邪恶的隐式类型转换。但是您还应该将函数定义为 returns numeric
,因为这就是 to_number()
returns。否则,您将再次 获得隐式数据类型转换。
CREATE OR REPLACE FUNCTION test_function(_date text)
RETURNS numeric AS
$BODY$
select to_number(_date, '9999x99x99')';
$BODY$
LANGUAGE sql;