南大通用数据库(Gbase 8s) 创建UDR外部函数

一、在使用 date_format、from_unixtime、to_days、yearweek 函数时,Gbase 8s 数据库不支持,可以使用创建 UDR 外部函数来实现

二、登录命令控制台或者使用 navicat 连接 Gbase 数据库

这里使用 navicat ,点击新增连接选择 PostGreSql 驱动,添加地址、账号、密码

连接数据库后,选中目标库选中目标模式,再点击函数-新增函数执行以下语句即可

注意:这里 选中 public 模式,使用 mss 用户,自行修改函数中对应的内容( 例如:FUNCTION "public"."date_format"、OWNER TO "mss")

  1. date_format 函数

    javascript 复制代码
    CREATE OR REPLACE FUNCTION "public"."date_format"("ctimestamp" timestamptz, "informate" varchar)
     RETURNS "pg_catalog"."varchar" AS $BODY$
       -- Routine body goes here...
     DECLARE  
           result_current_date varchar;
       BEGIN
    --             IF upper($1) = upper('YYYY-MM-DD') || upper($1) = upper('%Y-%M-%D') THEN
    --                     SELECT to_char(now(),'YYYY-MM-DD') into result_current_date;
    --             END IF;
    --     
    --             
    --             IF upper($1) = upper('%Y-%M-%D %h:%m') || upper($1) = upper('%Y-%M-%D %h:%m') THEN
    --                     SELECT to_char(now(),'YYYY-MM-DD HH:mm') into result_current_date;
    --             END IF;
    --             
    --           IF upper($1) = upper('%Y-%M-%D %h:%m:%s') || upper($1) = upper('%Y-%M-%D %h:%m:%s') THEN
    --                     SELECT to_char(now(),'YYYY-MM-DD HH:mm:ss') into result_current_date;
    --             END IF;
               
               case upper($2)
                   when upper('%Y') then
                       SELECT to_char(smalldatetime_to_timestamp($1),'YYYY') into result_current_date;
                   when upper('%Y-%M') then
                       SELECT to_char(smalldatetime_to_timestamp($1),'YYYY-MM') into result_current_date;                    
                   when upper('%Y-%M-%D') then
                       SELECT to_char(smalldatetime_to_timestamp($1),'YYYY-MM-DD') into result_current_date;
                   when upper('%Y-%M-%D %h') then
                       SELECT to_char(smalldatetime_to_timestamp($1),'YYYY-MM-DD HH24') into result_current_date;
                   when upper('%Y-%M-%D %h:%m') then
                       SELECT to_char(smalldatetime_to_timestamp($1),'YYYY-MM-DD HH24:MI') into result_current_date;
                   when upper('%Y-%M-%D %h:%m:%s') then
                       SELECT to_char(smalldatetime_to_timestamp($1),'YYYY-MM-DD HH24:MI:ss') into result_current_date;            
                   when upper('%M') then
                       SELECT to_char(smalldatetime_to_timestamp($1),'MM') into result_current_date;                
                   when upper('%M-%D') then
                       SELECT to_char(smalldatetime_to_timestamp($1),'MM-DD') into result_current_date;
                   when upper('%D') then
                       SELECT to_char(smalldatetime_to_timestamp($1),'DD') into result_current_date;
                   when upper('%h') then
                       SELECT to_char(smalldatetime_to_timestamp($1),'HH24') into result_current_date;    
                   when upper('%h:%m') then
                       SELECT to_char(smalldatetime_to_timestamp($1),'HH24:MI') into result_current_date;            
                   when upper('%m') then
                       SELECT to_char(smalldatetime_to_timestamp($1),'MI') into result_current_date;                            
                   when upper('%m:%s') then
                       SELECT to_char(smalldatetime_to_timestamp($1),'MI:ss') into result_current_date;        
                   when upper('%s') then
                       SELECT to_char(smalldatetime_to_timestamp($1),'ss') into result_current_date;                                                                
                   when upper('%h:%m:%s') then
                       SELECT to_char(smalldatetime_to_timestamp($1),'HH24:MI:ss') into result_current_date;            
                                                   
                   else
                       SELECT to_char(smalldatetime_to_timestamp($1),informate) into result_current_date;
               end case;
               
           RETURN result_current_date;
    END$BODY$
     LANGUAGE plpgsql VOLATILE
     COST 100;
    
    ALTER FUNCTION "public"."date_format"("ctimestamp" timestamptz, "informate" varchar) OWNER TO "mss";

    查询语句:

    复制代码
    SELECT date_format(now(),'%Y-%M-%D %h:%m:%s');
  2. from_unixtime 函数

    javascript 复制代码
    CREATE OR REPLACE FUNCTION "public"."from_unixtime"("t" int8)
      RETURNS "pg_catalog"."timestamp" AS $BODY$
      DECLARE  
            result_current_date timestamp;
      BEGIN  
         select TO_TIMESTAMP(t) into result_current_date;
        RETURN result_current_date;
    END; $BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100;
      
    ALTER FUNCTION "public"."from_unixtime"("t" int8) OWNER TO "mss";

    查询语句:

    复制代码
    select from_unixtime(1692328679);
  3. to_days 函数

    javascript 复制代码
    -- 参数 varchar类型
    CREATE OR REPLACE FUNCTION "public"."to_days"("ctimestamp" varchar)
      RETURNS "pg_catalog"."int4" AS $BODY$
        -- Routine body goes here...
      DECLARE  
            result_current_date int4;
        BEGIN
                SELECT TIMESTAMPDIFF(day, '0001-01-01', $1) into result_current_date;
            RETURN result_current_date;
    END$BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100;
    
    
    ALTER FUNCTION "public"."to_days"("ctimestamp" varchar) OWNER TO "mss";
    
    -- 参数 timestamptz 类型
    CREATE OR REPLACE FUNCTION "public"."to_days"("ctimestamp" timestamptz)
      RETURNS "pg_catalog"."int4" AS $BODY$
        -- Routine body goes here...
      DECLARE  
            result_current_date int4;
        BEGIN
                SELECT TIMESTAMPDIFF(day, '0001-01-01', $1) into result_current_date;
            RETURN result_current_date;
    END$BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100;
    
    
    ALTER FUNCTION "public"."to_days"("ctimestamp" timestamptz) OWNER TO "mss";

    查询语句:

    复制代码
    select to_days(now());
  4. yearweek 函数

    javascript 复制代码
    CREATE OR REPLACE FUNCTION "public"."yearweek"("ctimestamp" timestamptz)
      RETURNS "pg_catalog"."int4" AS $BODY$
        -- Routine body goes here...
      DECLARE  
            week_n int4;
            year_n int4;
        BEGIN
                SELECT to_char(smalldatetime_to_timestamp($1),'YYYY') into year_n;
                SELECT trunc(1 + (smalldatetime_to_timestamp($1) - TRUNC(smalldatetime_to_timestamp($1), 'YEAR')) / 7) into week_n;
            RETURN ((year_n*100)+week_n);
    END$BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100;
    
    
    ALTER FUNCTION "public"."yearweek"("ctimestamp" timestamptz) OWNER TO "mss";

    查询语句:

    复制代码
    select YEARWEEK(now());
    select YEARWEEK('2023-01-03 12');
相关推荐
白远山5 分钟前
货运跑腿搬家平台开发实战:从需求分析到落地部署指南
数据库·数据挖掘·需求分析
geovindu18 分钟前
sql: Data Modeling Patterns
数据库·sql·设计模式·sqlserver
上海蓝色星球24 分钟前
蓝色星球NG-AIOS新型AI工业操作系统重磅发布——以本体智能为内核,重构“AI+制造“新范式
大数据·数据库·人工智能·机器人
瀚高PG实验室33 分钟前
瀚高数据库如何克隆表
数据库·sql·postgresql·瀚高数据库
雨辰AI1 小时前
信创多租户项目 9 大踩坑|数据隔离失效、权限越权终极解决(金仓 / 达梦 / 高斯全库适配)
java·大数据·数据库·后端
严同学正在努力1 小时前
认识 SQL Server 的 T-SQL 语法
数据库·人工智能·ai·oracle·dba
EatFan1 小时前
我为什么把患者与病例从 1:1 改成 1:N?一次真实数据库模型重构记录
数据库·后端·重构·健康医疗·全栈
xujuzheng2 小时前
2026深圳小程序/App/AI智能体开发公司选型指南(附本地服务商盘点)
数据库·科技·微信小程序·小程序·uni-app
不剪发的Tony老师2 小时前
DuckDB教程:常用文本函数
数据库·sql·数据分析·duckdb
ManageEngineITSM2 小时前
什么是IT服务连续性管理?灾难恢复与业务连续性一文讲清
数据库·microsoft·工单系统·变更管理