gpt4 book ai didi

postgresql - PL/PgSQL : No function matches the given name and argument types. 您可能需要添加显式类型转换

转载 作者:行者123 更新时间:2023-11-29 12:28:58 32 4
gpt4 key购买 nike

我正在尝试使用 PL/PgSQL 编写一个 dateadd() 函数。我希望能够添加从秒到年到日期/时间戳的任何内容。拼凑了一个函数(从网上获得的片段等),并提出了这个“实现”:

CREATE OR REPLACE FUNCTION dateadd(diffType VARCHAR(15), incrementValue int, inputDate timestamp) RETURNS timestamp AS $$
DECLARE
YEAR_CONST Char(15) := 'year';
MONTH_CONST Char(15) := 'month';
DAY_CONST Char(15) := 'day';
HOUR_CONST Char(15) := 'hour';
MIN_CONST Char(15) := 'min';
SEC_CONST Char(15) := 'sec';

dateTemp Date;
intervals interval;
BEGIN
IF lower($1) = lower(YEAR_CONST) THEN
select cast(cast(incrementvalue as character varying) || ' year' as interval) into intervals;
ELSEIF lower($1) = lower(MONTH_CONST) THEN
select cast(cast(incrementvalue as character varying) || ' months' as interval) into intervals;
ELSEIF lower($1) = lower(DAY_CONST) THEN
select cast(cast(incrementvalue as character varying) || ' day' as interval) into intervals;
ELSEIF lower($1) = lower(HOUR_CONST) THEN
select cast(cast(incrementvalue as character varying) || ' hour' as interval) into intervals;
ELSEIF lower($1) = lower(MIN_CONST) THEN
select cast(cast(incrementvalue as character varying) || ' minute' as interval) into intervals;
ELSEIF lower($1) = lower(SEC_CONST) THEN
select cast(cast(incrementvalue as character varying) || ' second' as interval) into intervals;
END IF;

dateTemp:= inputdate + intervals;

RETURN dateTemp;
END;
$$ IMMUTABLE LANGUAGE plpgsql;

但是,当我尝试使用该函数时,出现以下错误:

template1=# select dateadd('hour', 1, getdate());
ERROR: function dateadd(unknown, integer, timestamp with time zone) does not exist
LINE 1: select dateadd('hour', 1, getdate());
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
template1=#

为什么PG找不到函数?

我在 Ubuntu 12.0.4 LTS 上运行 PG 9.3

最佳答案

您会踢自己一脚:出错的行(以及接下来的几行)与之前的行之间的区别在于您不小心在错误的位置添加了下划线:

你有

HOUR_CONST_Char(15) := 'hour';

应该是

HOUR_CONST Char(15) := 'hour';

编辑

更新后的问题受到 Postgres 稍微挑剔的类型系统的影响:您的 getdate() 函数返回 timestamp with time zone,但是您的 dateadd 接受一个时间戳(即没有时区的时间戳)。使用 Postgres 的简写来转换 value::type,这应该有效(SQLFiddle demo, using now() in place of getdate())

select dateadd('hour', 1, getdate()::timestamp);

但是,您还有其他一些奇怪的类型选择:

  • 您的“常量”是 Char(15),但长度不是 15 个字符,因此将用空格填充;您可能应该使用 VarChar(15),或者甚至只是 text(与 MS SQL 不同,在 Postgres 中,所有字符串都动态存储在页外,而 VarChar 本质上只是具有最大长度限制的 text
  • 您的中间变量(可能被重构掉)是 Date 类型,而不是 Timestamp,因此会将输入截断为日期部分,没有时间。

最后,我要指出一个基本的优化:您不需要 lower() 您的常量,因为您已经知道它们是小写的。 :)

关于postgresql - PL/PgSQL : No function matches the given name and argument types. 您可能需要添加显式类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19839650/

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