Oracle

在 PLSQL 中處理“char(10)”數據類型/TRY_CONVERT 等效列中不正確日期格式的更好方法

  • March 7, 2021

我有一個具有以下結構的源表:

create table customer_info
(customer_num    number,
birth_date      char(10))

不幸的是,birth_date列數據類型char(10)不是date. 此表的一些範例數據如下所示:

customer_num    |  birth_date        
--------------------------------
 1             |  2001/01/01            
 1             |  2010/01/01            
 1             |  2021/01/01             
 1             |  12hhhhuu6   --> Incorrect date          
 1             |  2001/01/01            
 1             |  2001/23/01  --> Incorrect date

我所做的是編寫一個函式來評估每條記錄並返回它的正確格式,但如您所知,對每條記錄使用一個函式並不是一個好主意,它會以某種方式降低性能。我想知道您是否可以為此提出更好的方法。

create or replace function new_to_date_en(d varchar2) return DATE
is
 v_date date;
begin
 select to_date(d,'yyyy/mm/dd' ) into v_date from dual;
 return to_date(d,'yyyy/mm/dd');
 exception when others then return to_dateto_date('2021/03/07', 'yyyy/mm/dd');
end;  

使用功能:

select customer_num,
       new_to_date_en(birth_date)
from customer_info;

T-SQL 中有一種方法COALESCE(TRY_CONVERT(date, @date, 111), '2012-01-01')。oracle plsql中有類似的方法嗎?

提前致謝

TRY_CONVERT是為每條記錄呼叫的函式,有什麼不同?

以下工作自 12.2 起:

SQL> alter session set nls_date_format='YYYY/MM/DD';

Session altered.

SQL> select cast('2021/03/07' as date default date'2012-01-01' on conversion error) from dual;

CAST('2021
----------
2021/03/07

SQL> select cast('X021/zz/99' as date default date'2012-01-01' on conversion error) from dual;

CAST('2021
----------
2012/01/01

SQL> select to_date('X021/zz/99' default date'2012-01-01' on conversion error, 'YYYY/MM/DD') from dual;

TO_DATE('X
----------
2012/01/01

SQL>

在您的版本上,您可以使用您的功能。

引用自:https://dba.stackexchange.com/questions/286618