问题很简单:如果我已经在没有时区的列类型时间戳中有数据,如果我将类型设置为带时区的时间戳,postgresql对这些数据做了什么?
答案 0 :(得分:51)
它将当前值保持在localtime并将时区设置为本地时间的偏移量:
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子句] ,则默认转换与从旧数据类型转换为new的赋值相同。
无时区的时间戳与带时区的时间戳之间的转换通常假设时间戳没有时区值应该被视为或给出为 timezone 当地时间。可以使用
AT TIME ZONE
为转换指定不同的时区。
答案 1 :(得分:25)
最好明确指定时区。比如,如果您的时间戳应该是 UTC (但没有时区),您应该警惕客户端或服务器的时区可能会弄乱这里的所有内容。而是写:
ALTER TABLE a ALTER COLUMN t TYPE TIMESTAMP WITH TIME ZONE USING t AT TIME ZONE 'UTC'