【发布时间】:2017-05-03 21:30:47
【问题描述】:
我想要做的是将我的日期列类型从 varchar 更改为不带时区的时间戳,并迁移我的所有数据。这就是我正在做的事情:
ALTER TABLE mytable ALTER COLUMN "datecol"
TYPE timestamp without time zone USING(to_timestamp("datecol", 'YYYY-MM-DD')::timestamp without time zone);
如果 datecol 中的数据采用日期格式,则此方法可以正常工作。但是,如果我有一些无效数据,例如随机字符串(例如“abc”),我如何验证并检查日期格式是否正确?我想为那些无效字段设置默认值。
编辑:感谢路德维格,我解决了我的问题:
create or replace function is_date(s varchar) returns boolean as $$
begin
perform s::date;
return true;
exception when others then
return false;
end;
$$ language plpgsql;
ALTER TABLE mytable ALTER COLUMN "datecol"
TYPE timestamp without time zone USING(
CASE WHEN is_date("datecol") = true
THEN to_timestamp("datecol", 'YYYY-MM-DD')::timestamp without time zone
ELSE '1970-01-01 00:00:00.000'
END
);
【问题讨论】:
-
This answer 可能对你有帮助。
-
date format is good哪种日期格式好?只有这样:'YYYY-MM-DD'? -
不,to_timestamp 识别格式如下:YYYY、YYYY-MM、YYYY-MM-DD、YYYY/MM/DD、YYYY.MM.DD 等。对于这些格式,它可以正常工作
标签: sql database postgresql