2017-10-11 136 views
0

我有列column_name VARCHAR2與各種數據。將其轉換爲DATE數據類型我寫了下面的表達式:將Oracle VARCHAR2轉換爲DATE並排除無效數據

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

但它給我的錯誤:

ORA-01841: (full) year must be between -4713 and +9999, and not be 0 01841. 00000 - "(full) year must be between -4713 and +9999, and not be 0"

*Cause: Illegal year entered

*Action: Input year in the specified range

柱包括NULLspace00000000和字符串日期,如 「20161111」。

要排除無效數據,我決定使用DECODE

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

但在這種情況下,我得到了以下錯誤:

ORA-01841: (full) year must be between -4713 and +9999, and not be 0 01841. 00000 - "(full) year must be between -4713 and +9999, and not be 0"

*Cause: Illegal year entered

*Action: Input year in the specified range

數據例如:

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

什麼時我做錯了?

是否有解決方案排除所有無效的數據,而不包括在DECODE的情況下?

+0

你能顯示一些來自列的示例數據嗎? –

+1

請勿粘貼圖片,請使用文字。 –

+0

你認爲'20161111'有效嗎? (即2016-11-11) –

回答

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

+0

好的答案 - 任何其他方法都必須至少重複部分Oracle日期驗證 –

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

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) 

很顯然,這不是一個完美的解決方案,但它工作在很多情況下。