2012-03-19 123 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'