날짜 필드 (date s_date
)와 설명 필드 (varchar2(n) desc
)가 포함 된 테이블이 있습니다. 필요한 것은 스크립트 (또는 가능하면 단일 쿼리)를 작성하고 desc
필드를 구문 분석하고 유효한 Oracle 날짜가 포함 된 경우이 날짜를 자르고 null
인 경우 s_date
을 업데이트합니다.PL/SQL varchar에서 날짜 검색 최적화
그러나 하나 이상의 조건이 있습니다. 정확히 중 하나가 desc
에 나와야합니다. 0 또는> 1 인 경우 아무 것도 업데이트하지 않아야합니다. 나는 정규 표현식을 사용하여이 꽤 추한 솔루션을 내놓았다 시간으로
:
----------------------------------------------
create or replace function to_date_single(p_date_str in varchar2)
return date
is
l_date date;
pRegEx varchar(150);
pResStr varchar(150);
begin
pRegEx := '((0[1-9]|[12][0-9]|3[01])[.](0[1-9]|1[012])[.](19|20)\d\d)((.|\n|\t|\s)*((0[1-9]|[12][0-9]|3[01])[.](0[1-9]|1[012])[.](19|20)\d\d))?';
pResStr := regexp_substr(p_date_str, pRegEx);
if not (length(pResStr) = 10)
then return null;
end if;
l_date := to_date(pResStr, 'dd.mm.yyyy');
return l_date;
exception
when others then return null;
end to_date_single;
----------------------------------------------
update myTable t
set t.s_date = to_date_single(t.desc)
where t.s_date is null;
----------------------------------------------
하지만 매우 느리게 작동하고 (각 레코드에 대한 두 번째보다 내가 약 30000 레코드를 업데이트해야합니다). 어떻게 든 기능을 최적화 할 수 있습니까? 어쩌면 정규식을 사용하지 않고 그 일을 할 수있는 방법일까요? 다른 아이디어?
어떤 조언은 감사합니다 :)
는편집 :
OK, 어쩌면 누군가를 위해 도움이 될 것입니다.
(((0[1-9]|[12]\d|3[01])\.(0[13578]|1[02])\.((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\.(0[13456789]|1[012])\.((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\.02\.((19|[2-9]\d)\d{2}))|(29\.02\.((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))
내가 제안하는 쿼리와 함께 사용 다음 정규 표현식은 윤년에 대한 검사를 포함 한 달에 계정에 일 수를 고려 유효 기간 (DD.MM.YYYY), 검사 수행 @David (받아 들인 대답을보십시오), 그러나 update
대신 select
를 시도했습니다 (우리가 regexp_substr
을하지 않기 때문에 행 당 1 정규 표현식이 더 적습니다). "벤치마킹"용도로만 사용하십시오.
숫자는 아마도 여기서는별로 알려주지 않을 것입니다. 하드웨어, 소프트웨어 및 특정 DB 디자인에 따라 다르 겠지만, 36K 레코드를 선택하는 데 약 2 분이 걸렸습니다. 업데이트 속도는 느려지 겠지만 여전히 합리적인 시간이라고 생각합니다.
당신은 유효 "의 몇 가지 예를들 수 : (이 느린 때문에) 당신이 당신의
to_date_single
기능을 적용 할 을 행의 액수를 필터링 할 수 있지만, 정규 표현식 혼자 당신이 원하는 것을하지 않을 것이다 다윗의 아이디어 @ 사용 오라클 날짜 "많은 사람들이 그게 (나를 포함하여) 될 것입니다 익숙하지 않을 것입니다. – greedybuddha"DD.MM.YYYY"형식을 사용 중입니다. – Slippy