在 postgreSQL 中将 varchar 列更新为最新

update vachar column to date in postgreSQL

尝试更新具有 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');

但都return错误信息

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

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

查询:

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

是正确的。

错误消息表示您在列 columnname 中的值无效(实际上无效值是 'columnname')。 列中的所有值都必须采用 'YYYY-MM-DD' 格式,例如'2015-01-01'(或为空)。


新列的解决方案。

创建一个函数将 varchar 转换为 date,其中 returns 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);