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

举报
你是猴子请来的救兵吗 发表于 2021/12/01 10:10:15 2021/12/01
【摘要】 当前时间获取方式汇总,总有一个适合你!

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_TIME timetz timetz time
CURRENT_TIMESTAMP([fsp]) CURRENT_TIMESTAMP() timestamptz timestamptz timestamp
LOCALTIME([fsp]) LOCALTIME time time timestamp

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

4. 小结

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


想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技,后台还可获取众多学习资料哦~

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。