将Oracle VARCHAR2转换为DATE并排除无效数据

时间:2017-10-11 12:53:08

标签: sql oracle date

我的列column_name VARCHAR2包含各种数据。要将其转换为DATE数据类型,我编写了以下表达式:

SELECT TO_DATE(column_name, 'YYYY/MM/DD') FROM schema.table;

但它给了我错误:

  

ORA-01841 :(完整)年份必须介于-4713和+9999之间,而不是0   01841. 00000 - “(完整)年份必须介于-4713和+9999之间,而不是0”

     

*原因:非法年份进入

     

*操作:在指定范围内输入年份

列由NULLspace00000000和字符串日期组成,例如“20161111”。

要排除无效数据,我决定使用DECODE

SELECT DECODE(column_name, 
              '', NULL, 
              '00000000', NULL, 
              TO_DATE(column_name, 'YYYY/MM/DD')) 
FROM schema.table; 

但在这种情况下,我收到以下错误:

  

ORA-01841 :(完整)年份必须介于-4713和+9999之间,而不是0   01841. 00000 - “(完整)年份必须介于-4713和+9999之间,而不是0”

     

*原因:非法年份进入

     

*操作:在指定范围内输入年份

数据示例:

| # | column_name |
|---|-------------|
| 1 | 00000000    |
| 2 |             |
| 3 | (null)      |
| 4 | 20161111    |

我做错了什么?

是否有任何解决方案可以排除所有无效数据而不包括DECODE?

3 个答案:

答案 0 :(得分:2)

你可以写一个这样的函数:

CREATE OR REPLACE FUNCTION VARCHAR_TO_DATE(str IN VARCHAR2) RETURN DATE AS
BEGIN
   RETURN TO_DATE(str, 'YYYY/MM/DD');
EXCEPTION
   WHEN OTHERS THEN
      RETURN NULL;
END;

然后将其用作

SELECT varchar_to_date(column_name) FROM schema.table;

任何无效字符串都将导致NULL值。

答案 1 :(得分:1)

写一个将处理异常的user-defined function

CREATE FUNCTION parse_Date(
  in_string     VARCHAR2,
  in_format     VARCHAR2 DEFAULT 'YYYY/MM/DD',
  in_nls_params VARCHAR2 DEFAULT NULL
) RETURN DATE DETERMINISTIC
AS
BEGIN
  RETURN TO_DATE( in_string, in_format, in_nls_params );
EXCEPTION
  WHEN OTHERS THEN
    RETURN NULL;
END;
/

然后你可以这样做:

SELECT parse_Date( column_name, 'YYYY/MM/DD' )
FROM   schema.table

否则您可以使用regular expressions to match different valid date patterns

答案 2 :(得分:1)

您可以使用CASEREGEXP_LIKE()

SELECT (CASE WHEN REGEXP_LIKE(column_name, '^[12][0-9]{3}/[01][0-9]/[0123][0-9]$')
             THEN TO_DATE(column_name, 'YYYY/MM/DD')
        END)

显然,这不是一个完美的解决方案,但它在许多情况下都有效。