您可以在 plpgsql 中编写自己的转换函数并进行错误处理。
创建或替换函数 to_timestamp_ignore_errors(text)
返回时间戳为 $$
开始
返回 $1::timestamp;
其他情况除外
返回空值;
结尾;
$$ 语言 plpgsql 不可变严格;
postgres=# 选择 to_timestamp_ignore_errors('bbbb');
to_timestamp_ignore_errors
----------------------------
(1 行)
postgres=# 选择 to_timestamp_ignore_errors('2013-08-16');
to_timestamp_ignore_errors
----------------------------
2013-08-16 00:00:00
(1 行)
其他可能性是在投射前进行格式检查 - 一些初始版本
创建或替换函数 to_timestamp_ignore_errors(text)
返回时间戳为 $$
-- 正规的应该更丰富
SELECT CASE WHEN $1 ~ '^\d{4}-\d{2}-\d{2}$' THEN $1::timestamp ELSE NULL END;
$$ 语言 SQL;
创建函数
postgres=# 选择 to_timestamp_ignore_errors('2013-08-16');
to_timestamp_ignore_errors
----------------------------
2013-08-16 00:00:00
(1 行)
postgres=# 选择 to_timestamp_ignore_errors('bbbb');
to_timestamp_ignore_errors
----------------------------
(1 行)
在 9.2 上测试
当错误最少时,基于正则表达式的版本应该会快一点(30%),而当错误很多时,速度会更快,所以这个解决方案更可取。因此,最好的解决方案是清理数据并使用好的类型。