【问题标题】:Append Date to a table name in Proc将日期附加到 Proc 中的表名
【发布时间】:2020-10-22 13:30:55
【问题描述】:

我创建了一个函数来获取 yyyymmdd 格式的当前日期值。

create or replace function currdate() returns text as $$ select 'account_'||TO_CHAR(current_date , 'yyyymmdd');
$$ LANGUAGE sql;

现在我必须编写一个 Proc 来将此日期 'yyyymmdd' 附加到创建快照表中,该快照表将在该月的第一天和最后一天创建。 我写了下面的过程

create or replace procedure proc_1() AS $$
declare 
dttoday text := currdate();
int_check int := checkint(); 
begin 
if int_check = 1 then 
create table **schema.snapshot_currdate** as (select * from schema1.original_table); end if;
end;
$$
language plpgsql;

在此处创建表时:snapshot_currdate 我需要将其创建为名称 snapshot_yyyymmdd(执行日期) 声明的变量 int_check 是一个函数,用于检查其每月的第一天或最后一天是否返回整数值 1

有什么想法吗?

【问题讨论】:

    标签: postgresql postgresql-9.1


    【解决方案1】:

    仅供参考,Postgres 9.1 已经过了 EOL 四年。 比如:

    
    currdate() returns text as $$ select 'account_'||TO_CHAR(current_date , 'yyyymmdd');
    $$ LANGUAGE sql;
    
    CREATE OR REPLACE PROCEDURE public.proc_1()
     LANGUAGE plpgsql
    AS $procedure$
    declare
    dttoday text := currdate();
    begin
    EXECUTE 'create table '|| quote_ident('public')||'.'||quote_ident('snapshot_'||split_part(dttoday, '_', 2))||'()';
    RAISE NOTICE '%', dttoday;
    end;
    $procedure$
    

    split_part 是因为currdate() 返回account_yyyymmdd 而你说你想要snapshot_yyyymmdd。有关动态命令的更多信息,请参见此处:

    https://www.postgresql.org/docs/current/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN

    【讨论】:

    • 嗨,阿德里安,感谢您的回复。一个 qq:你的 EXECUTE 语句说要创建表,但我怎么说从哪里得到它,我的意思是从子句如果我替换 Currdate() 只是得到 'yyyymmdd' 创建或替换函数 archive.currdate() 返回文本作为 $$ 选择 TO_CHAR(current_date , 'yyyymmdd'); $$ 语言 sql;
    • 如果您更改currdate(),那么您不需要split_part,只需quote_ident('snapshot_'||dttoday)。删除 '()' 后将 as (select * from schema1.original_table) 添加到语句末尾。
    • 我将 Currdate 输出更改为 'yyyymmdd' 并更新了 Proc CREATE OR REPLACE PROCEDURE Proc_1() LANGUAGE plpgsql AS $procedure$ declare dttoday text := currdate();开始执行'创建表'|| quote_ident('schema')||'.'||quote_ident('snapshot_'||dttoday) as (select * from table1);提高通知 '%', dttoday;结尾; $procedure$ 但在 Select * from 中看起来像一个 get 错误
    • || '作为(从表 1 中选择 *)'。您正在构建一个字符串。阅读我发布的文档链接。
    • 非常感谢您指导我完成这个
    猜你喜欢
    • 2010-12-20
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2020-10-30
    • 2014-07-28
    • 2013-08-31
    相关资源
    最近更新 更多