将 vachar 列更新为 postgreSQL 中的日期

acm*_*ers 2 postgresql postgresql-9.4

尝试使用varchar数据类型(例如“1950-08-14”)将列更新为数据date类型

UPDATE tablename SET columnname = to_date(columnname, 'YYYY-MM-DD');
Run Code Online (Sandbox Code Playgroud)

或者

ALTER TABLE tablename ALTER COLUMN columnname TYPE DATE USING to_date(columnname, 'YYYY-MM-DD');
Run Code Online (Sandbox Code Playgroud)

但都返回错误信息

ERROR:  invalid value "columnname" for "YYYY"
DETAIL:  Value must be an integer.
Run Code Online (Sandbox Code Playgroud)

参考http://www.postgresql.org/docs/9.4/static/functions-formatting.html

kli*_*lin 5

查询:

ALTER TABLE tablename 
    ALTER COLUMN columnname TYPE DATE USING to_date(columnname, 'YYYY-MM-DD');
Run Code Online (Sandbox Code Playgroud)

是正确的。

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


使用新列的解决方案。

创建一个函数以转换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 $$;
Run Code Online (Sandbox Code Playgroud)

添加一个新列并使用函数更新它:

alter table tablename add new_column date;

update tablename
set new_column = varchar_to_date_or_null(columnname);
Run Code Online (Sandbox Code Playgroud)