改变列数据类型 Postgres

use*_*012 12 postgresql postgresql-9.1

嘿,我刚刚开始研究 PostgreSQL,我想知道如何更改列的数据类型,我尝试了以下命令:

alter table tableName alter column columnName type timestamp with time zone;
Run Code Online (Sandbox Code Playgroud)

但是我收到以下消息:

 column "columnName" cannot be cast to type timestamp with time zone
Run Code Online (Sandbox Code Playgroud)

当前列的数据类型为 int,我想将其更改为时间戳

Tom*_*rta 8

Postgres 不知道如何将 int 转换为时间戳。有几种情况,通常它们有不同的开始日期。

  1. 创建带有时间戳的临时列
  2. 使用您自己的翻译更新表并将数据从旧列复制到临时列
  3. 删除旧列
  4. 重命名临时列。

如果您查看文档,您会发现一行语法以及如何转换 unix 时间整数类型的示例:

ALTER [ COLUMN ] column [ SET DATA ] TYPE type [ USING expression ]
Run Code Online (Sandbox Code Playgroud)

  • 文档中的 [example](http://www.postgresql.org/docs/current/static/sql-altertable.html#AEN67057) 完美地涵盖了这种情况:`ALTER TABLE foo ALTER COLUMN foo_timestamp SET DATA TYPE timestamp with time zone USING 时间戳与时区 'epoch' + foo_timestamp * 间隔 '1 秒';` (10认同)

Fra*_*nry 6

有一个更好的方法可以使用该USING子句来做到这一点。就像这样:

ALTER TABLE tableName 
ALTER columnName type TIMESTAMP WITH TIME ZONE 
USING to_timestamp(columnName) AT TIME ZONE 'America/New_York';
Run Code Online (Sandbox Code Playgroud)


Rit*_*Jha 5

Postgres 不允许 int 类型列直接更改为时区。要实现这一点,您必须首先将列类型更改为 varchar,然后将其更改为时区。

alter table tableName alter column columnName type varchar(64);

alter table tableName alter column columnName type timestamp with time zone;