GaussDB(DWS)当前时间函数详解
1. 前言
数据库中,我们通常用NOW、SYSDATE获取系统的当前时间,实际上获取当前时间有多种方式,可以根据实际业务和场景选择合适的接口。具体该怎么选择,废话不多说,直接上干货~
2. 当前时间含义
根据参考系不同,可以将当前时间的获取分为三类:
- 当前事务的开始时间
- 当前语句开始时间
- 函数被调用时的真实当前时间
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级数仓黑科技,后台还可获取众多学习资料哦~
- 点赞
- 收藏
- 关注作者
评论(0)