我正在尝试转换text
价值观timestamp
价值观。
对于下表称为a
:
id | c1
----+--------------------
1 | 03-03-2000
2 | 01-01-2000
3 | 12/4/1990
4 | 12 Sept 2011
5 | 12-1-1999 12:33:12
6 | 24-04-89 2:33 am
我正在尝试执行select
with a cast如下:
select id, c1,
c1::timestamp
as c2 from a;
如果只有前 5 行,则此方法可以正常工作,但对于第 6 行,c1
is 24-04-89 2:33 am
它抛出以下错误:
错误:日期/时间字段值超出范围:“24-04-89 2:33 am”
提示:也许您需要不同的“日期样式”设置。
我想要的是null
对于那些无法转换的值时间戳而不是命令完全失败。像这样:
id | c1 | c2
----+--------------------+---------------------
1 | 03-03-2000 | 2000-03-03 00:00:00
2 | 01-01-2000 | 2000-01-01 00:00:00
3 | 12/4/1990 | 1990-12-04 00:00:00
4 | 12 Sept 2011 | 2011-09-12 00:00:00
5 | 12-1-1999 12:33:12 | 1999-12-01 12:33:12
6 | 24-04-89 2:33 am | (null)
(6 rows)
EDIT:
另外,有没有通用的方法来实现这一点?即:(基于克林的回答 https://stackoverflow.com/a/30800989/457447) 一个 plpgsql 包装函数,将值设置为null
如果它所包围的函数抛出错误。
例如:一个函数set_null_on_error
可以像这样使用:
select id, c1,
set_null_on_error(c1::timestamp)
as c2 from a;
or
select id, c1,
set_null_on_error(to_number(c1, '99'))
as c2 from a;