GBase 8s存储过程中获取当前时间
GBase 8s数据库中获取当前时间,可以使用current year to second这样方式。
但在存储过程中,如果我们想要获取某一段语句的执行时间长度,需要使用两个变量获取当时时间,如下:
1 2 3 4 5 6 7 8 9 | 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均一样:
1 2 3 4 5 | 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,我们可以通过其获取到当前时间。如下:
1 2 3 4 5 6 7 8 9 | 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 ; |
执行该过程,得到正确的结果:
1 2 3 4 5 | call proc_datetime2(); (expression) dt1: 2021-02-24 01:45:19 dt2: 2021-02-24 01:45:24 1 row(s) retrieved. |
对于dbinfo函数的介绍,可以参考之前的介绍。
如果我们经常需要用到获取当时时间的功能,可以把其包装成个存储过程。
1 2 3 4 5 | 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 ; |
调用时,改成
1 2 3 4 5 6 7 8 9 | 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 ; |