web-dev-qa-db-ja.com

postgreSQLは列のデータ型をタイムゾーンなしのタイムスタンプに変更します

1列のデータをテキストからタイムスタンプ型に変更したい。私のデータにはタイムゾーンがありません。私のデータのフォーマットは、時刻と日付を含み、タイムゾーンを含まない28-03-17 17:22のようなものです。つまり、すべてのデータが同じタイムゾーンにあります。どうすればできますか?

以下にいくつかの方法を試しましたが、それでも適切な方法が見つかりません。あなたが私を助けることができることを願っています。

もちろん、問題が解決できれば、新しいテーブルを作成できます。

alter table AB
alter create_time type TIMESTAMP;

ERROR:  column "create_time" cannot be cast automatically to type timestamp without time zone
HINT:  You might need to specify "USING create_time::timestamp without time zone".
********** Error **********

ERROR: column "create_time" cannot be cast automatically to type timestamp without time zone
SQL state: 42804
Hint: You might need to specify "USING create_time::timestamp without time zone".
alter table AB
alter create_time type TIMESTAMP without time zone;

ERROR:  column "create_time" cannot be cast automatically to type timestamp without time zone
HINT:  You might need to specify "USING create_time::timestamp without time zone".
********** Error **********

ERROR: column "create_time" cannot be cast automatically to type timestamp without time zone
SQL state: 42804
Hint: You might need to specify "USING create_time::timestamp without time zone".
alter table AB
alter create_time::without time zone type TIMESTAMP;

ERROR:  syntax error at or near "::"
LINE 2:  alter create_time::without time zone type TIMESTAM
                          ^
********** Error **********

ERROR: syntax error at or near "::"
SQL state: 42601
Character: 50
alter table AB
alter create_time UTC type TIMESTAMP;

ERROR:  syntax error at or near "UTC"
LINE 2: alter create_time UTC type TIMESTAMP;
                          ^
********** Error **********

ERROR: syntax error at or near "UTC"
SQL state: 42601
Character: 50
7
Amy

create_timeはタイプTEXTであり、有効な日付値が含まれています。次のように変更する方が簡単です(最初にバックアップとしてテーブルダンプを実行することをお勧めします)。

-- Create a temporary TIMESTAMP column
ALTER TABLE AB ADD COLUMN create_time_holder TIMESTAMP without time zone NULL;

-- Copy casted value over to the temporary column
UPDATE AB SET create_time_holder = create_time::TIMESTAMP;

-- Modify original column using the temporary column
ALTER TABLE AB ALTER COLUMN create_time TYPE TIMESTAMP without time zone USING create_time_holder;

-- Drop the temporary column (after examining altered column values)
ALTER TABLE AB DROP COLUMN create_time_holder;
11
Leo C

USING...はタイプの後に続きます。

... alter create_time type TIMESTAMP USING create_time::TIMESTAMP;
4
Jasen

Create_timeの元のタイプを指定しなかったため、タイムゾーン付きのTIMEであると想定します(タイムゾーン付きのDATEまたはTIMESTAMPタイプは、タイムゾーンなしのTIMESTAMPに変更しようとしたときに上記のエラーを発生させないため)。 TIMESTAMPにはTIMEに加えて日付情報があるため、次のように、ALTERステートメントで日付情報を補足する必要があります。

ALTER TABLE AB ALTER COLUMN create_time TYPE TIMESTAMP without time zone USING date('20170327') + create_time;

対応するDATE列がある場合(たとえば、create_date)、次のようにそれをdate()関数に渡すことができます。

ALTER TABLE AB ALTER COLUMN create_time TYPE TIMESTAMP without time zone USING date(create_date) + create_time;
2
Leo C