2012-03-19 130 views
39

问题是简短的:如果我已经有一个列时间戳没有时区的数据,如果我设置类型时间戳与时区,postgresql做什么这个数据?PostgreSQL更改类型时间戳没有时区 - >与时区

+0

你是对的,但直到我启动我的应用程序/数据库/无论什么,答案可能会出现。 – gyorgyabraham 2012-03-19 15:23:54

+5

@a_horse_with_no_name因为“它曾经工作过”是一个非常糟糕的方式来知道它会做什么每次! – 2012-03-20 10:51:15

+0

@couling:所以你暗示如果多次运行同一组语句会产生不同的结果?即使所有输入参数都相同?在这种情况下,dbhenur的答案不能证明任何事情,因为根据你运行该声明,一次不能保证它下次将以相同的方式工作。 – 2012-03-20 11:44:04

回答

38

它保留在本地时间的电流值,并设置时区,以你的本地时间的偏移:

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:省略

如果[的使用条款是] ,默认转换与从旧数据类型转换为新转换的赋值相同。

根据无时间区和时间戳与时区时间戳之间的手册Date/Time types

换算通常假定时间戳而不时区值应取或作为给定当地时间时区。可以使用AT TIME ZONE为转换指定不同的时区。

+0

是的。此行为与从不带时区的时间戳到具有时区的时间戳一起转换完全相同。如果你想要一些不同的东西,你可以使用'ALTER COLUMN column TYPE type'使用'并使用时间函数来处理时区。 http://www.postgresql.org/docs/current/static/functions-datetime.html – 2012-03-20 11:02:31

12

明确指定时区会更好。假设您的时间戳记应该在UTC(但没有时区),那么您应该警惕客户端或服务器的时区可能会在这里搞乱一切。相反写:

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