[英]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”
*原因:输入的年份不合法
*操作:输入指定范围内的年份
列由NULL
, space
, 00000000
和字符串日期(如“ 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
否则,您可以使用正则表达式来匹配不同的有效日期模式 。
您可以只使用CASE
和REGEXP_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.