如何格式化那些没有抛出ORA-01843的记录?

时间:2018-04-11 10:52:12

标签: sql oracle formatting

我有一个包含以下示例数据的列。该列的数据类型为VARCHAR2.

050211
042911
110428
110428
AO0102
JAN 31
FEB 01

当我尝试使用以下代码以可读格式格式化列记录时,我正在

ORA-01843 : Not a valid month 

SELECT to_char(to_date(TRIM(MyColumn), 'YYMMDD'), 'MM/DD/YYYY') FROM MyTable;

由于记录AO0102,JAN 31,FEB 01,我认为ORA-01843被抛出。

如何忽略那些抛出ORA-01843并且只格式化那些可以在纯SQL select语句中格式化的记录的记录(可能只显示其原始值)?

1 个答案:

答案 0 :(得分:1)

使用CASE表达式检查列的状态,并且只有条件地尝试解析为有效日期:

SELECT
    MyColumn,
    CASE WHEN REGEXP_LIKE(MyColumn, '^\s*\d\d\d\d\d\d\s*$')
         THEN TO_CHAR(TO_DATE(TRIM(MyColumn), 'YYMMDD'), 'MM/DD/YYYY')
         ELSE MyColumn END AS new_col
FROM MyTable

但作为一般性评论,您应避免将日期信息存储在表格中作为文本。您现在看到了避免这种情况的原因之一。