Postgres DB列类型转换

时间:2017-11-30 08:56:50

标签: ruby-on-rails ruby database postgresql migration

尝试将字符串列转换为日期。列目前包含值,例如' 20170130'和' 20161130'。

当我尝试:

change_column :tickets, :string_date, :date

这给了我一个错误:

PG::DatatypeMismatch: ERROR:  column "string_date" cannot be cast automatically to type date. 
HINT:  Specify a USING expression to perform the conversion.

所以,我试试:

change_column :tickets, :string_date, 'date USING CAST(string_date AS date)'

仍然没有运气,出现以下错误:

  

PG :: InvalidDatetimeFormat:错误:类型为date的输入语法无效

任何人都知道发生了什么?想从字符串到日期转换会更容易......

提前致谢

1 个答案:

答案 0 :(得分:1)

奇怪 - 我希望看到你未能投出日期的价值,例如:

t=# create table a2(string_date text);
CREATE TABLE
t=# insert into a2 values ('20170130'),('20161130');
INSERT 0 2
t=# insert into a2 select 'bad value';
INSERT 0 1
t=# alter table a2 alter COLUMN string_date type date using string_date::date;
ERROR:  invalid input syntax for type date: "bad value"

也许是一个空字符串?..

无论如何 - 找到坏的值并修复它,然后尝试再次转换:

t=# select string_date from a2 where string_date !~ '\d{8}';
 string_date
-------------
 bad value
(1 row)
t=# begin;
BEGIN
t=# delete from a2 where string_date !~ '\d{8}';
DELETE 1
t=# alter table a2 alter COLUMN string_date type date using string_date::date;
ALTER TABLE
t=# end;
COMMIT