繁体   English   中英

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

[英]Convert Oracle VARCHAR2 to DATE and exclude invalid data

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

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

但这给了我错误:

ORA-01841 :(完整)年份必须在-4713和+9999之间,并且不能为001841。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之间,并且不能为001841。00000-“(完整)年份必须在-4713和+9999之间,并且不能为0”

*原因:输入的年份不合法

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

数据示例:

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

我究竟做错了什么?

有什么解决方案可以排除所有无效数据而在DECODE情况下不包括这些无效数据?

您可以编写如下函数:

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值。

编写一个用户定义的函数来处理异常:

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

否则,您可以使用正则表达式来匹配不同的有效日期模式

您可以只使用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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM