PostgreSQL更改types时间戳没有时区 – >与时区

问题很简单:如果我已经有一个没有时区的列types时间戳的数据,如果我把types设置为带有时区的时间戳,那么postgresql会用这个数据做什么?

它将当前值保持在本地时间,并将时区设置为您本地时间的偏移量:

 create table a(t timestamp without time zone, t2 timestamp with time zone); insert into a(t) values ('2012-03-01'::timestamp); update a set t2 = t; select * from a; t | t2 ---------------------+------------------------ 2012-03-01 00:00:00 | 2012-03-01 00:00:00-08 alter table a alter column t type timestamp with time zone; select * from a; t | t2 ------------------------+------------------------ 2012-03-01 00:00:00-08 | 2012-03-01 00:00:00-08 

根据Alter Table的手册:

如果省略[USING子句] ,则默认转换与从旧数据types转换为新的转换相同。

根据date/时间types的手册

不带时区的 时间戳和带时区的时间戳之间的转换通常假定不带时区值的时间戳应当作为时区本地时间来提供或给出。 使用AT TIME ZONE可以为转换指定不同的时区。

明确指定时区会更好。 说,如果你的时间戳应该是在UTC (但没有时区),你应该警惕的是,客户端或服务器的时区可能在这里搞乱了一切。 相反写:

 ALTER TABLE a ALTER COLUMN t TYPE TIMESTAMP WITH TIME ZONE USING t AT TIME ZONE 'UTC'