【问题标题】:to_number() returning wrong informationto_number() 返回错误信息
【发布时间】:2016-02-16 17:22:33
【问题描述】:

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

【问题讨论】:

    标签: sql postgresql function greenplum


    【解决方案1】:

    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;
    

    如果您想传递 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;
    

    【讨论】:

      猜你喜欢
      • 2014-01-29
      • 2019-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-21
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多