gpt4 book ai didi

sql - to_number() 返回错误信息

转载 作者:行者123 更新时间:2023-11-29 14:19:19 26 4
gpt4 key购买 nike

在 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 年。当我输入其他日期时,我也会得到其他随机的“年份”。我在这里做错了什么?

最佳答案

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

知道任何关于日期的事情。

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

然后 to_number() 函数会看到:“2012 minus 1 minus 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() 返回的内容。否则,您将再次获得隐式数据类型转换。

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

关于sql - to_number() 返回错误信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35439051/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com