GBase 8s存储过程中获取当前时间

GBase 8s数据库中获取当前时间,可以使用current year to second这样方式。
但在存储过程中,如果我们想要获取某一段语句的执行时间长度,需要使用两个变量获取当时时间,如下:

drop procedure if exists proc_datetime;
create procedure proc_datetime() returns varchar(255);
  define dt1 datetime year to second;
  define dt2 datetime year to second;
  let dt1 = current year to second;
  system "sleep 5";
  let dt2 = current year to second;
  return "dt1: " || dt1 || " dt2: " || dt2;
end procedure;

执行该过程,我们发现返回的两个时间dt1和dt2均一样:

call proc_datetime();

(expression)  dt1: 2021-02-24 01:31:13 dt2: 2021-02-24 01:31:13

1 row(s) retrieved.

原因是:存储过程内的时间点均为存储过程开始执行的时刻。
那么,我们在存储过程中获取变化的时间呢?其实在sysmaster:sysshmvals表中有个系统时间戳的字段sh_curtime,我们可以通过其获取到当前时间。如下:

drop procedure if exists proc_datetime2;
create procedure proc_datetime2() returns varchar(255);
  define dt1 datetime year to second;
  define dt2 datetime year to second;
  select DBINFO('utc_to_datetime',sh_curtime)  into dt1 from sysmaster:sysshmvals;
  system "sleep 5";
  select DBINFO('utc_to_datetime',sh_curtime)  into dt2 from sysmaster:sysshmvals;
  return "dt1: " || dt1 || " dt2: " || dt2;
end procedure;

执行该过程,得到正确的结果:

call proc_datetime2();

(expression)  dt1: 2021-02-24 01:45:19 dt2: 2021-02-24 01:45:24

1 row(s) retrieved.

对于dbinfo函数的介绍,可以参考之前的介绍。

如果我们经常需要用到获取当时时间的功能,可以把其包装成个存储过程。

create procedure getsysdate() returns datetime year to second;
  define tmpdate datetime year to second;
  select DBINFO('utc_to_datetime',sh_curtime)  into tmpdate from sysmaster:sysshmvals;
  return tmpdate;
end procedure;

调用时,改成

drop procedure if exists proc_datetime3;
create procedure proc_datetime3() returns varchar(255);
  define dt1 datetime year to second;
  define dt2 datetime year to second;
  let dt1 = getsysdate();
  system "sleep 5";
  let dt2 = getsysdate();
  return "dt1: " || dt1 || " dt2: " || dt2;
end procedure;

标签: gbase 8s, GBase, 当时时间, 系统时间, current year to second

添加新评论