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;