質問は簡単です:タイムゾーンのない列タイプのタイムスタンプに既にデータがある場合、タイムゾーンのあるタイムスタンプにタイプを設定すると、postgresqlはこのデータで何をしますか?
現在の値をローカルタイムに保持し、タイムゾーンをローカルタイムのオフセットに設定します:
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
を使用して、変換に別のタイムゾーンを指定できます。
タイムゾーンを明示的に指定することをお勧めします。タイムスタンプが-[〜#〜] utc [〜#〜](ただしタイムゾーンなし)にあることになっている場合、クライアントまたはサーバーのタイムゾーンがここですべてを台無しにします。代わりに書きます:
ALTER TABLE a ALTER COLUMN t TYPE TIMESTAMP WITH TIME ZONE USING t AT TIME ZONE 'UTC'