核心内容摘要
星空影视传媒:点亮梦想,追逐星辰大海的视界
文章目录环境文档用途详细信息环境系统平台N/A版本
4.
1,
4.
2文档用途用于指导HGDB修改时区的操作详细信息
查看系统时间与时区–linux系统[rootlocalhost ~]# date -RFri, 27 Jul 2018 14:37:48 0800–Windows系统控制面板–日期和时间–时区可以看到当前时区
查看HGDB数据库的时区与时间highgo# select now();now-------------------------------
:48:
3
57610208(1行记录)highgo# show time zone;TimeZone----------------Asia/Hong_Kong(1行记录)
查看HGDB数据库所有可供选择的时区highgo# select * from pg_timezone_names;name|abbrev|utc_offset|is_dst--------------------------------------------------------------Africa/Abidjan|GMT|00:00:00|f Africa/Accra|GMT|00:00:00|f Africa/Addis_Ababa|EAT|03:00:00|f Africa/Algiers|CET|01:00:00|f Africa/Asmara|EAT|03:00:00|f Africa/Asmera|EAT|03:00:00|f Africa/Bamako|GMT|00:00:00|f Africa/Bangui|WAT|01:00:00|f Africa/Banjul|GMT|00:00:00|f Africa/Bissau|GMT|00:00:00|f Africa/Blantyre|CAT|02:00:00|f Africa/Brazzaville|WAT|01:00:00|f Africa/Bujumbura|CAT|02:00:00|f Africa/Cairo|EET|02:00:00|f Africa/Casablanca|WEST|01:00:00|t Africa/Ceuta|CEST|02:00:00|t Africa/Conakry|GMT|00:00:00|f......UCT|UCT|00:00:00|f Universal|UTC|00:00:00|f US/Alaska|AKDT|-08:00:00|t US/Aleutian|HDT|-09:00:00|t US/Arizona|MST|-07:00:00|f US/Central|CDT|-05:00:00|t US/East-Indiana|EDT|-04:00:00|t US/Eastern|EDT|-04:00:00|t US/Hawaii|HST|-10:00:00|f US/Indiana-Starke|CDT|-05:00:00|t US/Michigan|EDT|-04:00:00|t US/Mountain|MDT|-06:00:00|t US/Pacific|PDT|-07:00:00|t US/Pacific-New|PDT|-07:00:00|t US/Samoa|SST|-11:00:00|f UTC|UTC|00:00:00|f W-SU|MSK|03:00:00|f WET|WEST|01:00:00|t Zulu|UTC|00:00:00|f(593行记录)
数据库全局时区的修改确定当前要修改为哪个时区在上面结果中找到对应的时区名称修改配置文件$PG_DATA/postgresql.conf中的参数timezone和log_timezone的值然后重新加载配置文件即可。
修改数据库和用户级别的时区--查看当前数据库全局时区highgo# show time zone;TimeZone-----------US/Alaska(1行记录)--修改当前名为highgo的数据库时区highgo# alter database highgo set timezoneAsia/Hong_Kong;ALTERDATABASE--查询修改结果highgo# select * from pg_db_role_setting;setdatabase|setrole|setconfig-------------------------------------------------12428|0|{TimeZoneAsia/Hong_Kong}(1行记录)--修改角色highgo的时区highgo# alter role highgo set timezoneUS/Aleutian;ALTERROLE--查看修改后的效果highgo# select * from pg_db_role_setting;setdatabase|setrole|setconfig-------------------------------------------------12428|0|{TimeZoneAsia/Hong_Kong}0|10|{TimeZoneUS/Aleutian}(2行记录)--查看全局时区highgo# show time zone;TimeZone-----------US/Alaska(1行记录)HGDB可以设置数据库、角色、会话级别的时区会话级别的仅对当前会话起作用同理角色及数据库级别的仅对设置的角色及数据库起作用但不会影响设置时连接的会话需要重新连接角色或数据库后才会生效。
时区修改后表中已有的数据只有TIMESTAMP WITH time zone类型会随时区的变化而改变如果是time WITH time zone类型可以在查询时直接转换为当前使用的时区例如highgo# SELECT
14:00:0008 at time zone US/Alaska;timezone---------------------
:00:00(1行记录)如需将其他的时间类型修正到修改后的时区可参考如下步骤1计算两个时区间的时间差两时区间的时间差(当前时区-目标时区)目标时区的时间当前时区的时间-(当前时区-目标时区)(注:东时区为正西时区为负)例当前时区为Asia/Hong_Kong即东8区UTC/GMT08:00目标时区为US/Alaska即西8区UTC/GMT-08:00两时区间的时间差(
-(-
16已知东八区当前时间为
12:00计算西八区的时间西八区时间
12:00-((
-(-
)
20:00:
根据上面的公式计算出时间差编写update语句批量更新数据即可。
修改时区对数据的影响修改时区后数据类型“TIMESTAMP WITH time zone”会随时区发生变化其余时间类型不会跟随时区改变。
以下实验说明了这种影响--查看当前时区东八区highgo# show time zone;TimeZone----------------Asia/Hong_Kong(1行记录)--创建测试表highgo# CREATE TABLE test_zone ( id NUMERIC, tpz TIMESTAMP WITH time zone, tpoutz TIMESTAMP, twz time WITH time zone, twoz time without time zone );CREATETABLE--插入测试数据highgo# INSERT into test_zone VALUES(1,
12:00:00,
12:00:00,
12:00:00,
12:00:
;INSERT01highgo# INSERT into test_zone VALUES(2,
13:00:00,
13:00:00,
13:00:00,
13:00:
;INSERT01highgo# INSERT into test_zone VALUES(3,
14:00:00,
14:00:00,
14:00:00,
14:00:
;INSERT01highgo#highgo# SELECT * from test_zone;id|tpz|tpoutz|twz|twoz------------------------------------------------------------------------1|
:00:0008|
:00:00|12:00:0008|12:00:002|
:00:0008|
:00:00|13:00:0008|13:00:003|
:00:0008|
:00:00|14:00:0008|14:00:00(3行记录)--修改当前时区改为西八区log_timezoneUS/AlaskatimezoneUS/Alaskapg_ctl reload-D D:\highgo\database\
4.
2\data--再次查询结果highgo# show time zone;TimeZone-----------US/Alaska(1行记录)highgo# SELECT * from test_zone;id|tpz|tpoutz|twz|twoz------------------------------------------------------------------------1|
:00:
|
:00:00|12:00:0008|12:00:002|
:00:
|
:00:00|13:00:0008|13:00:003|
:00:
|
:00:00|14:00:0008|14:00:00(3行记录)--由以上结果可知仅有tpz列数据类型为TIMESTAMP WITH time zone跟随时区发生了改变其余列数据类型分别为TIMESTAMP、time WITH time zone、time without time zone未根据时区发生改变。
--根据当前的时区修正数据两个时区间相差16小时需要更新的字段为tpoutz、twz、twoz语句如下UPDATEtest_zonesettpoutztpoutz-INTERVAL16 hours,twztwz attimezoneUS/Alaska,twoztwoz-INTERVAL16 hours--数据更新之后查询结果如下highgo# SELECT * from test_zone;id|tpz|tpoutz|twz|twoz------------------------------------------------------------------------1|