在PostgreSQL中将列类型从字符变化到时区,没有时区

时间:2012-11-14 04:01:40

标签: ruby-on-rails-3 postgresql datetime types

在rails中我创建了一个名为open_time的字符串列,但后来我意识到我应该使用datetime类型。我做了

change_column :polls, :open_time, :datetime

但它说:

PG::Error: ERROR:  column "open_time" cannot be cast to type timestamp without time zone
: ALTER TABLE "polls" ALTER COLUMN "open_time" TYPE timestamp

如果我只删除字符串列并添加新的datetime列,我将丢失存储在字符串列中的数据。或者,在PostgreSQL中我添加列:

 ALTER TABLE polls ADD COLUMN published_time timestamp;

然后我尝试从字符串列中获取数据,如:

UPDATE polls SET published_time = strToTimeStamp(open_time);

所以我的问题是有没有我可以用作strToTimeStamp的函数可以将字符变化类型转换为没有时区类型的时间戳?

2 个答案:

答案 0 :(得分:5)

  

..是否有任何我可以用作strToTimeStamp的函数可以转换   字符变化类型到时间戳没有时区类型?

使用to_timestamp()更改列的数据类型。

ALTER TABLE tbl ALTER COLUMN col TYPE timestamp
USING to_timestamp(col, '<your pattern here>');

在这些非常相似的问题下更多:
Alter character field to date
Cast varchar type to date

答案 1 :(得分:-3)

不要认为你能做到这一点,因为它受到数据库能力的限制。这个想法正在做:

  • 创建了一个名称不同的新列
  • 在每行数据转换后复制列内容
  • 删除原始col
  • 将新列表重命名为原始列名称

这些步骤可以放在同一个迁移文件中,并保存到事务中以防万一。