【问题标题】:Creating insert function with TIMESTAMP使用 TIMESTAMP 创建插入函数
【发布时间】:2021-05-30 14:56:34
【问题描述】:

我用一个简单的函数创建了一个简单的表,为过去的学期插入一些日志:

CREATE TABLE log_elapsedsemester(
sy char(9) NOT NULL,
sem char(1) NOT NULL,
date_recorded TIMESTAMP NOT NULL,
recordedby varchar(255)
);

CREATE OR REPLACE FUNCTION addelapsedsemester(p_sy char,p_sem char,p_date_recorded 
TIMESTAMP,p_recordedby varchar)
returns void
AS
$$
BEGIN
insert into log_elapsedsemester (sy,sem,date_recorded,recordedby) values 
(p_sy,p_sem,p_date_recorded,p_recordedby);
END
$$
LANGUAGE plpgsql;

但每次我使用

select addelapsedsemester('2019-2020','1',now(),'sample@gmail.com');

我得到错误:

No function matches the given name and argument types. You might need to add explicit type casts.

如果我使用没有任何功能的简单INSERT,它会成功插入:

insert into log_elapsedsemester(sy,sem,date_recorded,recordedby) values ('2020- 
2021','1',now(),'sample@gmail.com');

我正在使用 PostgreSQL 9.5 和 pgadmin III。

【问题讨论】:

    标签: postgresql function types casting postgresql-9.5


    【解决方案1】:

    您需要明确地转换为timestamp。喜欢:

    SELECT addelapsedsemester('2019-2020', '1', now()::timestamp,'sample@gmail.com');
    

    或使用LOCALTIMESTAMP 代替now()::timestamp(等效)。

    函数now() 返回类型timestamp with time zone (timestamptz),而您的函数采用timestamp without time zone (timestamp)。 now() 函数产生一个 typed 值(与其他无类型文字不同),Postgres 更不愿意将其强制转换为不同的类型。 Function type resolution 不成功。

    相同的类型强制仍然适用于裸 INSERT 命令,因为 (quoting the manual):

    如果任何列的表达式不是正确的数据类型,将尝试自动类型转换。

    请注意,从timestamptztimestamp 的转换取决于会话的当前timezone 设置。您可能想要更明确。喜欢now() AT TIME ZONE 'Europe/London'。或使用timestamptz 开头。然后你原来的没有演员的电话就可以了。见:

    另外,您很可能不想使用 char 类型,这会误导 character(1) 的简短语法。请改用textvarchar。见:

    这个表定义会更有意义:

    CREATE TABLE log_elapsedsemester(
      sy varchar(9) NOT NULL
    , sem integer   NOT NULL
    , date_recorded timestamptz NOT NULL
    , recordedby text
    );
    

    甚至:

    sy integer NOT NULL  -- 2019 can stand for '2019-2020'
    

    函数参数将匹配列类型。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 2015-07-22
    • 2012-04-03
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多