在 postgreSQL 中将 varchar 列更新为最新

Posted

技术标签:

【中文标题】在 postgreSQL 中将 varchar 列更新为最新【英文标题】:update vachar column to date in postgreSQL 【发布时间】:2015-09-25 23:21:35 【问题描述】:

尝试使用 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

【问题讨论】:

您确定没有引用列名吗?你能显示你正在运行的实际查询吗? 对于“columnname”的第一个实例,我尝试使用相同的列,即被更改为 to_date() 的列以及一个新的“date”类型的空列名 【参考方案1】:

查询:

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

是正确的。

错误信息表示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 $$;

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

alter table tablename add new_column date;

update tablename
set new_column = varchar_to_date_or_null(columnname);

【讨论】:

知道如何绕过这个吗?我有一个包含 45,000 行的表,其中包含一列文本数据类型的日期。我看过的似乎都遵循“YYYY-MM-DD”的格式......也许有些输入不正确?我应该先删除不符合该格式的字符串吗? 很好,谢谢!方便的是,我也一直在努力更好地使用“创建或替换功能”。

以上是关于在 postgreSQL 中将 varchar 列更新为最新的主要内容,如果未能解决你的问题,请参考以下文章

如何在oracle中将列varchar更改为clob

在 Azure Synapse 中将 .parquet 文件 varchar 列转换为日期时间

如何在 PostgreSQL 11.1 中将现有列更改为身份

在单个查询中将VARCHAR(max)列转换为大写,然后转换为XML

PostgreSQL:删除列并重新创建依赖视图

如何更改 PostgreSQL 表并使列唯一?