
# 数据库时间与系统时间不一致，如何更改数据库默认时区
#### 问题现象
数据库时间与操作系统不一致，查询DWS数据库默认时间SYSDATE，结果数据库时间比北京时间慢8个小时，导致无法准确定位到更新数据。
#### 原因分析
DWS数据库显示和解释时间类型数值时使用的时区默认为"UTC"。如果操作系统时间所设置的时区不是UTC时区，就会出现DWS数据库时间和系统时间不一致的情况。通常情况下集群时区不需要进行修改，设置客户端时区可以对SQL执行产生影响。例如，如果系统时间所设置的时区为北京时区，北京时区是东八区，比UTC时间早8小时。
#### 前提条件
建议在业务低峰期修改"timezone"参数。
#### 处理方法
**方法一：更改某个DWS集群的数据库默认时区**。
1. 登录[DWS控制台](https://console.huaweicloud.com/dws)。
2. 在左侧导航栏中，单击集群 \> 集群列表。
3. 在集群列表中找到所需要的集群，单击集群名称，进入集群"集群详情"页面。
4. 单击"参数修改"页签，在"参数列表"中找到"timezone"修改其参数值为您所在的时区，然后单击"保存"。
5. 在"修改预览"窗口，确认修改无误后，单击"保存"。
6. 用户可根据界面中参数"timezone"所在行的"是否重启"列，判断修改参数后是否需要重启操作。 
   ![](https://support.huaweicloud.com/trouble-dws/figure/zh-cn_image_0000001806225845.png "点击放大")
   ![](https://support.huaweicloud.com/trouble-dws/public_sys-resources/note_3.0-zh-cn.png)
   修改"timezone"参数后无需重启集群操作，则修改后立即生效。
   
   
**方法二：通过SQL命令查询和更改数据库时区。**
1. 查询客户端时区和当前时间。其中客户端时区为UTC时区，now()函数返回当前时间。 
   ```
   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保存时区。 
   ```
   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表插入当前时间并查询当前表。 
   ```
   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表。 
   ```
   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根据客户端时区对查询结果进行转换。 
   ```
   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)
   ```
   ![](https://support.huaweicloud.com/trouble-dws/public_sys-resources/note_3.0-zh-cn.png)
   - timestamp类型只受数据在插入时的时区影响，查询结果不受客户端时区影响。
   
   - timestamptz类型在数据插入时记录了时区信息，查询时会根据客户端时区做转换，以客户端时区显示数据。
    
   
   
 
