暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

从存储到运算:南大通用GBase 8s数据库TIMESTAMP_WITH_TIME_ZONE全链路技术揭

原创 GBASE数据库 2025-03-07
35

原文链接:https://www.gbase.cn/community/post/5509
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

在 GBase 8s 数据库中,TIMESTAMP WITH TIME ZONE 用于存储日期和时间信息以及时区信息的数据类型。本文将详细解析这一数据类型的特点、应用及其在GBase 8s中的实现方式。

语法

参数说明:

元素

描述

限制

语法

fractional_seconds_precision

可选项,秒的小数部分

取值范围是0-5,默认5。

数值

时区部分的实质是 INTERVAL HOUR TO MINUTE 类型,取值范围:-12:59 与+14:00 之间。

TIMESTAMP_WITH_TIME_ZONE 数据类型存储年、月、日、小时、分钟、秒和时区信息。与其他简单的日期时间类型相比,它不仅能精确到秒以下的小数部分(最多可达 5 位小数),还能记录时间对应的时区偏移量。例如,2025-01-20 12:30:00.12343 +08:00 此时间的表示,既包含了精确的时间点,又说明了该时间处于东八区。

 

参数说明:

元素

描述

限制

语法

hh

与utc时间的偏移小时

有效范围是-12到+14

数值

mi

与utc时间的偏移分钟

有效范围是00到59

数值

该功能仅在 GBase 8s 的 ORACLE 模式下支持。

设置时区

默认操作系统时区

默认情况下,数据库会获取服务器上的当前时区。可通过 timedatectl 命令查看。如下所示:

测试所有的服务器的时区为 Time zone: Asia/Shanghai (CST, +0800)

[root@sysbench201 ~]# timedatectl
      Local time: Mon 2025-01-20 14:05:58 CST
  Universal time: Mon 2025-01-20 06:05:58 UTC
        RTC time: Mon 2025-01-20 06:05:59
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
复制

 

要更改系统的时区,可以使用 timedatectl set-timezone 命令,后跟所需的时区信息。例如,要将时区设置为上海,可以执行以下命令:

timedatectl set-timezone "Asia/Shanghai"
复制

通过环境变量 GL_TIME_ZONE 设置

可通过设置 GL_TIME_ZONE 环境变量,指定数据库的初始化时区。export GL_TIME_ZONE='+4:00'。

当系统环境变量GL_TIME_ZONE也没有时,默认是当前操作系统的时区。

ALTER SESSION SET TIME_ZONE 

可通过 alter session set time_zone 语句修改当前会话的时区。

> alter session set time_zone='-09:21';

Environment set.

Elapsed time: 0.001 sec
复制

设置时区类型数据的输出输入格式

可通过alter session set nls_timestamp_tz_format 语句设置时区类型的输出格式。NLS_TIMESTAMP_TZ_FORMAT默认为” yyyy-mm-dd hh24:mi:ss.ff tzh:tzm ”。

例:

> alter session set nls_timestamp_tz_format='yyyy-mm-dd hh24/mi/ss.ff tzh/tzm';

Environment set.

> select timestamp '2023-12-21 12:44:11 +8:10' from dual;

(CONSTANT)  2023-12-21 12/44/11.00000 +08/10

1 row(s) retrieved.
复制

 

TIMESTAMP WITH TIME ZONE 类型示例

示例数据库版本为:GBase8sV8.8_3.6.1

示例1:TIMESTAMP WITH TIME ZONE 类型默认毫秒精度为 5

set environment sqlmode 'oracle';
create table t1(id int,c1 TIMESTAMP WITH TIME ZONE);
--插入数据
insert into t1 values(1,'2023-02-10 23:25:33.1234 +08:00');
insert into t1 values(2, timestamp '2023-02-10 23:25:33 +08:00');
insert into t1 values(3, timestamp '2011-01-01 10:00:00');
insert into t1 values(4,'2025-01-01 09:22:33.002 -05:00');
--查询
> select * from t1;
        ID C1

         1 2023-02-10 23:25:33.12340 +08:00
         2 2023-02-10 23:25:33.00000 +08:00
         3 2011-01-01 10:00:00.00000 +08:00
         4 2025-01-01 09:22:33.00200 -05:00

4 row(s) retrieved.
复制

示例2:设置时区类型数据的输出输入格式

> alter session set nls_timestamp_tz_format='yyyy-mm-dd hh24:mi:ss.ff3 tzh:tzm';
Environment set.
create table t2(id int,c1 TIMESTAMP(3) WITH TIME ZONE);
insert into t2 values(1, '2023-02-10 23:25:33.124 +08:00');
insert into t2 values(2, '2023-02-10 23:25:33 +10:22');
> select * from t2 order by id;
ID  1
C1  2023-02-10 23:25:33.123 +08:00

ID  1
C1  2023-02-10 23:25:33.124 +08:00

2 row(s) retrieved.
复制

示例3:修改当前会话时区

> alter session set time_zone='-09:21';

Environment set.
> insert into t2 values(10,timestamp '2025-01-02 09:00:02.100');

1 row(s) inserted.
> select * from t2;
ID  1
C1  2023-02-10 23:25:33.123 +08:00

ID  1
C1  2023-02-10 23:25:33.124 +08:00

ID  10
C1  2025-01-02 09:00:02.100 -09:21     ---新增数据的默认时区值已变为 -09:21

3 row(s) retrieved.
复制

示例4:通过设置GL_TIME_ZONE环境变量来修改时区

[root@sysbench201 gbases361]# export GL_TIME_ZONE='+4:00'
[root@sysbench201 gbases361]# dbaccess test -
Your evaluation license will expire on 2026-01-17 00:00:00
Database selected.
> set environment sqlmode 'oracle';
Environment set.
> select * from t2;
        ID C1

         1 2023-02-10 23:25:33.123 +08:00
         1 2023-02-10 23:25:33.124 +08:00
        10 2025-01-02 09:00:02.100 -09:21

3 row(s) retrieved.

> insert into t2 values(11,current_timestamp);
1 row(s) inserted.
> select * from t2;
        ID C1

         1 2023-02-10 23:25:33.123 +08:00
         1 2023-02-10 23:25:33.124 +08:00
        10 2025-01-02 09:00:02.100 -09:21
        11 2025-01-20 14:47:54.715 +04:00  --新插入的数据的时区为 +04:00

4 row(s) retrieved.
复制

TIMESTAMP_WITH_TIME_ZONE数据类型是GBase 8s数据库处理跨时区数据的工具。它不仅提供了精确的时间记录能力,还通过灵活的时区设置方法,使得数据库能够适应全球化的业务需求。无论是金融、物流还是在线服务,GBase 8s都能提供稳定可靠的时区处理能力。通过本文的介绍,相信读者对GBase 8s中的TIMESTAMP_WITH_TIME_ZONE数据类型有了更深入的了解。在实际应用中,合理利用这一数据类型,可以大大提高数据处理的准确性和效率。

原文链接:https://www.gbase.cn/community/post/5509
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论