2012-03-19 13 views
39

質問は短く:タイムゾーンを持たないカラムタイプのタイムスタンプにすでにデータがある場合、タイムゾーンを持つタイムスタンプにタイプを設定すると、postgresqlはこのデータは?PostgreSQLはタイムゾーンのないタイムスタンプを変更する - >タイムゾーンを使用する

+0

あなたは正しいですが、私のアプリケーション/ db/whateverを起動するまで、答えが出るかもしれません。 – gyorgyabraham

+5

@a_horse_with_no_nameなぜなら、「それは一度はうまくいきました」というのは、何時に何ができるのかを知るための非常に悪い方法ですから! –

+0

@couling:複数回実行すると、同じステートメントセットで異なる結果が生じることを暗示していますか?すべての入力パラメータが同じであっても?この場合、dbhenurの答えは何も証明されません。なぜなら、そのステートメントを実行することによって、次回は同じ方法で動作するとは保証されないからです。 –

答えて

38

それはlocaltimeの中に現在の値を維持し、あなたの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句があります]既定の変換は、古いデータ型から新しいものへの代入キャストと同じです。

タイムスタンプ間Date/Time types

変換するためのマニュアルに従って時間なしタイムゾーンとゾーンとタイムスタンプがは、通常時間帯値無しタイムスタンプとし、または与えられるべきであることを前提としていtimezone現地時間。 AT TIME ZONEを使用して、異なるタイムゾーンを指定することができます。

+0

はい。この動作は、タイムゾーンなしのタイムスタンプからタイムゾーン付きのタイムスタンプへのキャストとまったく同じです。異なるものを使用したい場合は、 'ALTER COLUMN column TYPE TYPE TYPE USING 'を使用し、時間帯を扱うための時間関数を使用することができます。 http://www.postgresql.org/docs/current/static/functions-datetime.html –

12

明示的にタイムゾーンを指定する方が良いです。タイムスタンプがUTC(ただしタイムゾーンなし)に設定されている場合は、クライアントまたはサーバーのタイムゾーンがすべてここで混乱している可能性があることに注意する必要があります。代わりに:

ALTER TABLE a ALTER COLUMN t TYPE TIMESTAMP WITH TIME ZONE USING t AT TIME ZONE 'UTC' 
関連する問題