GaussDB(DWS)当前时间函数详解

1. 前言

数据库中,我们通常用NOW、SYSDATE获取系统的当前时间,实际上获取当前时间有多种方式,可以根据实际业务和场景选择合适的接口。具体该怎么选择,废话不多说,直接上干货~

2. 当前时间含义

根据参考系不同,可以将当前时间的获取分为三类:

  1. 当前事务的开始时间
  2. 当前语句开始时间
  3. 函数被调用时的真实当前时间

2.1. 事务执行时间

GaussDB(DWS)中,典型的获取事务执行时间函数是transaction_timestamp(),其命名清楚地反映了它的返回值含义,它按照当前事务的开始时刻返回结果,并且在事务运行的整个期间内都不会改变。此类函数适用于同一个事务里的多个执行语句需要用到相同时间戳的场景。

2.2. 语句执行时间

GaussDB(DWS)中,典型的获取语句执行时间函数是statement_timestamp(),其命名清楚地反映了它的返回值含义,它按照当前语句的开始时刻返回结果,在语句结束前都不会变,就意味着语句中如果存在多个执行函数的话,它们的时间戳是一致的。此类函数适用于同一语句中的多个函数或表达式中需要用到相同时间戳的场景。

2.3. 函数执行时间

GaussDB(DWS)中,典型的获取函数执行时间函数是clock_timestamp(),与前两种不同,clock_timestamp()返回真正的当前时间,它的值在同一条SQL语句中都会变化。此类函数适用于同一语句中的多个函数或表达式中需要用到不同时间戳的场景。
多说一句,timeofday()和clock_timestamp()相似,也返回真正的当前时间,但这个结果是格式化后的字符串,而不是timestamp with time zone值,这里不做过多介绍。

2.4. 实例验证

下面我们通过实例来感受下它们的区别:

// 事务开启
postgres=# begin transaction;
BEGIN
// 事务时间
postgres=# select transaction_timestamp();
    transaction_timestamp
------------------------------
 2021-11-30 11:31:41.93671+08
(1 row)
// 延时1s
postgres=# select pg_sleep(1);
 pg_sleep
----------

(1 row)
// 事务时间不变
postgres=# select transaction_timestamp();
    transaction_timestamp
------------------------------
 2021-11-30 11:31:41.93671+08
(1 row)
// 语句时间不变,函数时间实时变化
postgres=# select statement_timestamp(),clock_timestamp(),pg_sleep(1),statement_timestamp(),clock_timestamp();
      statement_timestamp      |        clock_timestamp        | pg_sleep |      statement_timestamp      |       clock_timestamp
-------------------------------+-------------------------------+----------+-------------------------------+------------------------------
 2021-11-30 11:31:42.944032+08 | 2021-11-30 11:31:42.944196+08 |          | 2021-11-30 11:31:42.944032+08 | 2021-11-30 11:31:43.94529+08
(1 row)
// 事务结束
postgres=# commit;
COMMIT

3. 兼容模式差异

3.1. 返回值差异

GaussDB(DWS)支持多种兼容模式,这里总结了各兼容模式下时间函数所代表含义,供大家参考:

函数名ORA兼容模式TD兼容模式MYSQL兼容模式
transaction_timestamp()事务时间事务时间事务时间
statement_timestamp()语句时间语句时间语句时间
clock_timestamp()函数时间函数时间函数时间
CURRENT_DATE() CURRENT_DATE事务时间事务时间语句时间
CURRENT_TIME([fsp]) CURRENT_TIME事务时间事务时间语句时间
CURRENT_TIMESTAMP CURRENT_TIMESTAMP()语句时间语句时间语句时间
CURRENT_TIMESTAMP(fsp)事务时间事务时间语句时间
LOCALTIME([fsp]) LOCALTIME事务时间事务时间语句时间
LOCALTIMESTAMP([fsp]) LOCALTIMESTAMP事务时间事务时间语句时间
NOW([fsp])事务时间事务时间语句时间
SYSDATE([fsp]) SYSDATE语句时间语句时间函数时间

以上结果基于GaussDB(DWS)8.1.2统计

3.2. 返回类型差异

除了返回值的差异,部分函数在不同兼容模式会存在返回类型差异,主要是带时区和不带时区的类型差异,适用时需注意。下表罗列了存在类型差异的函数,供大家参考:

函数名ORA兼容模式TD兼容模式MYSQL兼容模式
CURRENT_TIME([fsp]) CURRENT_TIMEtimetztimetztime
CURRENT_TIMESTAMP([fsp]) CURRENT_TIMESTAMP()timestamptztimestamptztimestamp
LOCALTIME([fsp]) LOCALTIMEtimetimetimestamp

以上结果基于GaussDB(DWS)8.1.2统计

4. 小结

在实际使用中,我们通常不会特别注意当前时间的含义,但是在使用事务时需特别注意三种时间函数的结果差异,通过选择合适的函数,以确保SQL语句执行能够与预期一致,避免产生非预期的结果。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值