在postgreSQL中更新vachar列到目前为止

时间:2015-09-25 23:21:36

标签: postgresql postgresql-9.4

尝试使用varchar数据类型更新列,例如'1950-08-14'使用

date数据类型
UPDATE tablename SET columnname = to_date(columnname, 'YYYY-MM-DD');

ALTER TABLE tablename ALTER COLUMN columnname TYPE DATE USING to_date(columnname, 'YYYY-MM-DD');

但都返回错误消息

ERROR:  invalid value "columnname" for "YYYY"
DETAIL:  Value must be an integer.

引用http://www.postgresql.org/docs/9.4/static/functions-formatting.html

1 个答案:

答案 0 :(得分:2)

查询:

ALTER TABLE tablename 
    ALTER COLUMN columnname TYPE DATE USING to_date(columnname, 'YYYY-MM-DD');

是对的。

错误消息表示您在columnname列中包含无效值(实际上,无效值为'列名')。 列中的所有值必须具有格式' YYYY-MM-DD',例如' 2015年1月1日' (或为空)。

使用新列的解决方案。

创建一个将varchar转换为date的函数,该函数返回null表示无效值:

create or replace function varchar_to_date_or_null(str varchar)
returns date language plpgsql as $$
begin
    return to_date(str, 'YYYY-MM-DD');
exception
    when invalid_datetime_format then return null;
end $$;

添加新列并使用以下函数进行更新:

alter table tablename add new_column date;

update tablename
set new_column = varchar_to_date_or_null(columnname);