Postgresql 将没有时区的时间戳更新为有时区

han*_*xue 6 postgresql timestamp datetime

当我创建表时,创建了一个没有时区的时间戳列。所有导入的时间都在UTC. 现在我想明确添加时区信息,并且我已经更改了该列

ALTER TABLE review ALTER COLUMN review_time TYPE TIMESTAMP WITH TIME ZONE USING review_time AT TIME ZONE 'UTC';
Run Code Online (Sandbox Code Playgroud)

选择现有数据不显示添加的时区信息

review_time
2017-07-28 02:25:44
2017-07-28 03:10:35
2017-07-28 03:11:32
2017-07-28 03:11:35
2017-07-28 03:11:38
2017-07-28 03:11:41
2017-07-28 18:54:54
Run Code Online (Sandbox Code Playgroud)

我是否需要UPDATE对现有数据运行语句?如果需要,语法是什么?

更新1

缺少时区信息的输出是由于应用程序本身 (SQLWorkbenchJ) 造成的。查询 frompsql将显示时区

mydb # SELECT review_time FROM review;
      review_time       
------------------------
 2017-08-20 08:00:02+08
 2017-07-27 00:45:33+08
 2017-07-27 00:45:37+08
 2017-07-28 02:24:03+08
 2017-07-28 02:24:27+08
 2017-07-28 02:24:31+08
 2017-07-28 02:25:31+08
Run Code Online (Sandbox Code Playgroud)

Eva*_*oll 4

我也没有看到问题

创建样本数据,

CREATE TABLE foo(ts) AS VALUES (
  now()::timestamp without time zone
);
Run Code Online (Sandbox Code Playgroud)

显示它,

TABLE foo;
             ts             
----------------------------
 2017-09-30 14:25:24.954084
(1 row)
Run Code Online (Sandbox Code Playgroud)

您可以在上面看到输出中没有 tz。现在让我们更改为使用with time zone.

ALTER TABLE foo
  ALTER COLUMN ts
  SET DATA TYPE timestamp with time zone;
Run Code Online (Sandbox Code Playgroud)

这是输出,请注意您的 tz 为 -05

TABLE foo;

              ts               
-------------------------------
 2017-09-30 14:25:24.954084-05
(1 row)
Run Code Online (Sandbox Code Playgroud)

你的结果是什么SHOW TIME ZONE

有趣的是,我确实明白你在说什么,

# SELECT now()::timestamp with time zone::timestamp;
            now             
----------------------------
 2017-09-30 14:27:53.061616
(1 row)
Run Code Online (Sandbox Code Playgroud)

但是,我们必须知道您在问什么。