文档首页/ 数据仓库服务 GaussDB(DWS)/ 故障排除/ 数据库参数修改/ 数据库时间与系统时间不一致,如何更改数据库默认时区
更新时间:2024-11-05 GMT+08:00

数据库时间与系统时间不一致,如何更改数据库默认时区

问题现象

数据库时间与操作系统不一致,查询GaussDB(DWS)数据库默认时间SYSDATE,结果数据库时间比北京时间慢8个小时,导致无法准确定位到更新数据。

原因分析

GaussDB(DWS)数据库显示和解释时间类型数值时使用的时区默认为“UTC”。如果操作系统时间所设置的时区不是UTC时区,就会出现GaussDB(DWS)数据库时间和系统时间不一致的情况。通常情况下集群时区不需要进行修改,设置客户端时区可以对SQL执行产生影响。

前提条件

建议在业务低峰期修改“timezone”参数。

处理方法

方法一:更改某个GaussDB(DWS)集群的数据库默认时区

  1. 登录GaussDB(DWS)管理控制台。
  2. 在左侧导航栏中,单击“集群管理”
  3. 在集群列表中找到所需要的集群,单击集群名称,进入集群“基本信息”页面。
  4. 单击“参数修改”页签,修改参数“timezone”,修改为您所在的时区,然后单击“保存”
  5. “修改预览”窗口,确认修改无误后,单击“保存”
  6. 用户可根据界面中参数“timezone”所在行的“是否重启”列,判断修改参数后无需进行重启操作。

    修改“timezone”参数后无需重启集群操作 ,则修改后立即生效。

方法二:通过后台命令查询和更改数据库时区。

  1. 查询客户端时区和当前时间。其中客户端时区为UTC时区,now()函数返回当前时间。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    SHOW time zone;
     TimeZone
    ----------
     UTC
    (1 row)
     
    select now();
                  now
    -------------------------------
     2022-05-16 06:05:58.711454+00
    (1 row)
    

  2. 创建数据表,其中timestamp、timestamptz是常用的时间类型。timestamp不保存时区,timestamptz保存时区。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE timezone_test (id int, t1 timestamp, t2 timestamptz) DISTRIBUTE BY HASH (id);
    
    \d timezone_test
               Table "public.timezone_test"
     Column |            Type             | Modifiers
    --------+-----------------------------+-----------
     id     | integer                     |
     t1     | timestamp without time zone |
     t2     | timestamp with time zone    |
    

  3. 向timezone_test表插入当前时间并查询当前表。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    INSERT INTO timezone_test values (1, now(), now() );
    show time zone;
     TimeZone
    ----------
     UTC
    (1 row)
    
    SELECT * FROM timezone_test;
     id |             t1             |              t2
    ----+----------------------------+-------------------------------
      1 | 2022-05-16 06:10:04.564599 | 2022-05-16 06:10:04.564599+00
    (1 row)
    

    t1(timestamp类型)在保存数据时丢弃了时区信息,t2(timestamptz类型)保存了时区信息。

  4. 把客户端时区设置为东8区(UTC-8),再次查询timezone_test表。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    SET time zone 'UTC-8';
    SHOW time zone;
     TimeZone
    ----------
     UTC-8
    (1 row)
    
    SELECT now();
                  now
    -------------------------------
     2022-05-16 14:13:43.175416+08
    (1 row)
    

  5. 继续插入当前时间到timezone_test表,并查询。此时t1新插入的值使用的是东8区时间,t2根据客户端时区对查询结果进行转换。

    1
    2
    3
    4
    5
    6
    7
    INSERT INTO timezone_test values (2, now(), now() );
    SELECT * FROM timezone_test;
     id |             t1             |              t2
    ----+----------------------------+-------------------------------
      1 | 2022-05-16 06:10:04.564599 | 2022-05-16 14:10:04.564599+08
      2 | 2022-05-16 14:15:03.715265 | 2022-05-16 14:15:03.715265+08
    (2 rows)
    
    • timestamp类型只受数据在插入时的时区影响,查询结果不受客户端时区影响。
    • timestamptz类型在数据插入时记录了时区信息,查询时会根据客户端时区做转换,以客户端时区显示数据。