web-dev-qa-db-ja.com

PostgreSQLはタイムゾーンなしでタイプタイムスタンプを変更します->タイムゾーンあり

質問は簡単です:タイムゾーンのない列タイプのタイムスタンプに既にデータがある場合、タイムゾーンのあるタイムスタンプにタイプを設定すると、postgresqlはこのデータで何をしますか?

54
gyorgyabraham

現在の値をローカルタイムに保持し、タイムゾーンをローカルタイムのオフセットに設定します:

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

変更テーブル のマニュアルによると:

[USING句がある]が省略された場合、デフォルトの変換は、古いデータ型から新しいデータ型への代入キャストと同じです。

日付/時刻型 のマニュアルによると

タイムゾーンなしのタイムスタンプタイムゾーン付きタイムスタンプの間の変換は、通常、タイムゾーンなしのtimestamp値は、timezonelocalとして取得または指定する必要があります時間。 AT TIME ZONEを使用して、変換に別のタイムゾーンを指定できます。

53
dbenhur

タイムゾーンを明示的に指定することをお勧めします。タイムスタンプが-​​[〜#〜] utc [〜#〜](ただしタイムゾーンなし)にあることになっている場合、クライアントまたはサーバーのタイムゾーンがここですべてを台無しにします。代わりに書きます:

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