暂无图片
暂无图片
1
暂无图片
暂无图片
1
暂无图片

GBase 8s函数及一些常见自定义函数

原创 一直在路上 2022-03-08
4147

天津南大通用数据技术股份有限公司(GBASE)成立于2004年,始终坚持国产数据库的自主研发和推广,为用户提供全栈国产数据库产品和服务。
南大通用是国家级高新技术企业、国家规划布局内重点软件企业、信创工委会成员企业(0084),是目前国内专注于数据库产品研发,并且在金融、电信行业得到规模化应用的独立数据库服务商。

部分项目的实际应用,在mysql数据库向GBase 8s数据库的迁移过程中,部分函数之间的差异会给客户使用过程中带来一些困惑,稍作整理。

1、ascii:返回ascii码
2、substr:截取字符串
3、instr:字符串查找
4、concat/||:字符串拼接
5、length:字符串长度
6、lengthb:字符串长度byte
7、lower:字符串转小写
8、upper:字符串转大写
9、ltrim:字符串左边截取
10、rtrim:字符串右边截取
11、trim:字符串两边截取
12、replace:字符串替换
13、lpad:字符串左边填充
14、rpad:字符换右边填充
15、to_number:字符串转换为number类型
16、to_date:字符串转换为日期类型
17、select CAST(today::INTEGER::DECIMAL AS MONEY(16,2)) from dual;
18、select TO_CHAR(today, ‘yyyymmdd’) from dual;
19、select TO_DATE(‘20200508’, ‘yyyy-mm-dd’) from dual;
20、select TO_NUMBER(‘RMB100.00’) from dual;
21、abs(x):返回x的绝对值
22、floor(x):返回小于等于x的最大整数值
23、mod(x,y):返回x除以y的余数
24、power(x,y):返回x的y次幂
25、round(value,precision):四舍五入,根据给定的精度(precision)输入数值。
26、sign(x):返回x的正负标志
27、sqrt(x):返回x的平方根
28、trunc(value,precision)按精度(precision)截取某个数字,不进行舍入操作。
29、ceil (value) 产生大于或等于指定值(value)的最小整数。

mysql到gbase时间语法的转换例子:

date_format(Date_Sub(NOW(), interval floor(rand()*60) day),’%Y-%m-%d’) create_date

转换为

(current - floor(rand()*60) units day ) create_date

返回值"年-月":

select date_format(current,’%Y-%m’) date from dual;

A表中B,C两个时间字段,计算两个字段相差多少分钟,小时,天。

计算时间差,并换算成某个单位

select (((B - C)::interval minute(9) to minute)||’’)::integer from systables first 1;
select (B - C)::interval hour(9) to second from systables first 1;
select (B - C)::interval day(9) to day from systables first 1;

这个sql可以查上一个sql受影响的行数

select first 1 dbinfo(‘sqlca.sqlerrd2’) from dual;

dbinfo函数:
1111.png
用它实现int类型向date数据类型转换:
例如:

select dbinfo(‘utc_to_datetime’,1111111111) from dual;

GBase 8s语法
getdeptchildids函数创建:

find_in_set:

create function find_in_set(str varchar(255),strlist lvarchar(10000)) returns int;
  define currp  int;            -- 当前位置
  define lastp  int;            -- 上次位置
  define sepnum int;
  define strlen int;
  define strtmp lvarchar(10000);
 
  let lastp  = 1;
  let sepnum = 0;
  let strtmp = strlist || ",";  -- 追加一个分隔符','
  let strlen = length(strtmp);
  FOR currp = 1 TO strlen
    IF substr(strtmp,currp,1) = ',' THEN
      let sepnum = sepnum + 1;
      IF substr(strtmp,lastp,currp - lastp) = str THEN
        RETURN sepnum;
      END IF;
      let lastp = currp + 1;
    END IF;
  END FOR;
  RETURN 0;
end function;
复制

group_concat:

create aggregate group_concat with
(
  init = str_sum_init,
  iter = str_sum_iter,
  combine = str_sum_combine
);

复制

getdeptchildids:

CREATE  FUNCTION "gbasedbt".getdeptchildids(deptId BIGINT)RETURNS varchar(4000)
        define result varchar(4000);
        define temp_parent_id varchar(4000);
        let result= '$';
        let temp_parent_id= deptId||'';
        while temp_parent_id is not null

          let result=result||','||temp_parent_id ;
          select group_concat(a.dept_id) into temp_parent_id from sys_dept a where find_in_set(parent_id,temp_parent_id)>0;
        end while;

        return result;

END FUNCTION; 
复制

datediff(dt1,dt1)函数,两个日期的差值
– datediff

create function datediff(p1 datetime year to fraction(5), p2 datetime year to fraction(5))
returns int with (not variant);
  on exception
    return null;
  end exception;
  return substr(p1 - p2,1,9)::int;
end function;

复制

date_format(dt,fmt)函数,格式化日期时间
– date_format

create function date_format(p1 datetime year to fraction(5), p2 varchar(20))
returns varchar(40) with (not variant);
  define fmt varchar(20);
  on exception
    return null;
  end exception;
  let fmt = replace(p2,'i','M');
  let fmt = replace(fmt,'s','S');
  return gbase_to_char(p1,fmt);
end function;

复制
最后修改时间:2022-03-17 14:22:03
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

墨天轮福利君
暂无图片
3年前
评论
暂无图片 0
您好,您的文章已入选合格奖,10墨值奖励已经到账请查收! ❤️我们还会实时派发您的流量收益。
3年前
暂无图片 点赞
评论