[英]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.