I am trying to convert text values ββto timestamp values. For the following table: 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
I am trying to execute select with cast as follows:
select id, c1, c1::timestamp as c2 from a;
This works correctly if there were only the first 5 lines, but for the 6th line, where c1 is 24-04-89 2:33 am , it produces the following error:
ERROR: date / time field value out of range: "24-04-89 2:33 AM"
TIP. Perhaps you need a different "datestyle" setting.
I want null for those values ββthat cannot be selected for the timestamp, and not for the entire command. Like this:
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:
Also, is there a general way to implement this? i.e.: (based on klin answer ) the plpgsql wrapper function that sets to null if the function it wraps causes an error. For example, for the set_null_on_error function, which can be used as follows:
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;