簡體   English   中英

使用RegexLike檢查Oracle SQL中的特定日期格式

[英]Checking a specific date format in Oracle SQL using RegexLike

我正在使用oracle數據集成器作為ETL工具來加載數據,有一列作為源,其格式為YYYYMMDD ,例如:20190418。我要查詢該表以標識所有不適合20190418或YYYYMMDD格式的記錄。 PS 列為varchar2數據類型。

我已經嘗試過使用這樣的東西:

SELECT  CASE WHEN NOT REGEXP_LIKE('20190418', '^\d{4}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])$') then '00000000' else '20190418' END FROM DUAL; 

這似乎可以識別出那些非法日期,但例如,它不適用於此日期:“ 20181023 ”。

有人可以找出答案嗎,我想我缺少某種模式

我會建議一個函數而不是正則表達式,會更容易。

CREATE OR REPLACE FUNCTION Verify_date_number(inNumber IN NUMBER) RETURN VARCHAR2 AS        
    res DATE;
BEGIN   
    res := TO_DATE(inNumber, 'fxYYYYMMDD');       
    RETURN TO_CHAR(res, 'YYYYMMDD');       
EXCEPTION    
    WHEN OTHERS THEN        
        RETURN '00000000';
END;

如果您正在運行Oracle 12.2,則還可以使用VALIDATE_CONVERSION

SELECT
   CASE VALIDATE_CONVERSION('20190418' AS DATE, 'fxYYYYMMDD')
   WHEN 1 THEN '20190418'
   ELSE '00000000'
   END
FROM dual;

使用PL / SQL可能是更好的選擇

declare
   v_date     date;
begin
  for c in
  (
   select '20190418' as date_str from dual union all
   select '20191804' from dual union all
   select '201904187' from dual
  )
  loop
    begin    
       v_date := to_date(c.date_str,'yyyymmdd');    
       dbms_output.put_line(c.date_str);
      exception when others then null;   
    end;    
  end loop;  
end;  

僅給出適當格式的數據作為輸出。 在上述情況下,僅是20190418

對於20191804 ,我們將獲得ORA-01843: not a valid month

對於201904187 ,我們將得到ORA-01830: date format picture ends before converting entire input string

錯誤

您可以嘗試以下一種方法:

with tab as(
  select '20190418' as dat from dual union all
  select '20181023' as dat from dual union all  
  select '20181123' as dat from dual union all  
  select '20181223' as dat from dual union all  
  select '20181201' as dat from dual union all  
  select '20181209' as dat from dual union all  
  select '20181210' as dat from dual union all  
  select '20181229' as dat from dual union all  
  select '20181231' as dat from dual union all  
  select '20181232' as dat from dual union all    
  select '20181200' as dat from dual union all  
  select '20191418' as dat from dual 
)
SELECT  CASE WHEN NOT REGEXP_LIKE(dat, '^\d{4}(0[1-9]|(1[0-2]))(0[1-9]|[1-2][0-9]|3[0-1])$') then '00000000' else dat END  as dat

FROM tab; 

結果:

20190418
20181023
20181123
20181223
20181201
20181209
20181210
20181229
20181231
00000000
00000000
00000000

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM