我的列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”
*原因:非法年份进入
*操作:在指定范围内输入年份
列由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之间,而不是0 01841. 00000 - “(完整)年份必须介于-4713和+9999之间,而不是0”
*原因:非法年份进入
*操作:在指定范围内输入年份
数据示例:
| # | column_name |
|---|-------------|
| 1 | 00000000 |
| 2 | |
| 3 | (null) |
| 4 | 20161111 |
我做错了什么?
是否有任何解决方案可以排除所有无效数据而不包括DECODE?
答案 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)
您可以使用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)
显然,这不是一个完美的解决方案,但它在许多情况下都有效。