Проверка определенного формата даты в Oracle SQL с помощью RegexLike - PullRequest
0 голосов
/ 18 апреля 2019

Я использую интегратор данных Oracle в качестве инструмента ETL для загрузки данных, есть один столбец, который в качестве источника имеет формат ГГГГММДД для примера: 20190418. Я хочу запросить эту таблицу, чтобы определить все этизаписи, которые не соответствуют формату 20190418 или ГГГГММДД .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 '.

Может кто-нибудь разобраться, я думаю, что мне не хватает какого-то паттерна

Ответы [ 3 ]

2 голосов
/ 18 апреля 2019

Я бы предложил функцию, а не регулярное выражение, будет проще.

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;
1 голос
/ 18 апреля 2019

Использование 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

ошибка

0 голосов
/ 18 апреля 2019

Вы можете попробовать это:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...