고객을 위해 만료 된 신용 카드 데이터를 선택해야합니다. 아시다시피 카드의 만료 날짜는 MM 형식의 월과 YY 형식의 연도 만 사용합니다. 내 데이터베이스에서 모든 만료 날짜는 MMYY 형식으로 저장되므로 TO_DATE (FONDOS.VENCTARJETA, 'MMYY')를 사용하여 날짜를 얻은 다음 몇 가지 조건을 적용합니다.
이것은 내 쿼리입니다.
SELECT
TO_DATE(FONDOS.VENCTARJETA, 'MMYY') AS F_VENCIMIENTO
FROM
POLIZA POLIZA,
DATOS_FONDOSPOL FONDOS
WHERE
POLIZA.IDEPOL = FONDOS.IDEPOL AND
--TO_DATE(FONDOS.VENCTARJETA, 'MMYY') <= SYSDATE AND
POLIZA.CODINTER = TO_NUMBER(:P2_CLAVE)
이것은 다음과 같은 89 개의 행을 반환합니다.
F_VENCIMIENTO |
-------------------|
|
2023-08-01 00:00:00|
2020-08-01 00:00:00|
2021-11-01 00:00:00|
2020-09-01 00:00:00|
|
2023-02-01 00:00:00|
---- many more ----
결과를 통해 'MMYY'날짜를 날짜 유형 열로 변환 할 때 오류가 없음을 알 수 있습니다.
보시다시피 where 절에 조건을 주석 처리 한 다음 줄의 주석 처리를 제거하면 다음과 같이 표시됩니다.
ORA-01841 : (전체) 연도는 -4713에서 +9999 사이 여야하며 0이 아니어야합니다.
이 오류가 발생하는 유일한 동작은 아니지만 이것이 어떻게 실패하는지 보여줄 수있는 가장 간단한 동작입니다.
논리가 없어 왜 그런지 알 수 없습니다. 도와주세요. 감사.
필터 조건은 오라클이 최선이라고 결정한 순서대로 실행할 수 있습니다. 특정 형식 마스크를 사용하여 날짜로 제대로 변환되지 않지만 조인 조건에 의해 필터링되는 일부 행이 테이블에 있음을 나타냅니다. 필터를 포함하면 Oracle은 datos_fondospol
다른 테이블에 조인하기 전에 테이블에서 사전 필터링 할 수 있다는 것을 알 수 있으며 ,이 시점에서 모든 행이 함수에 도달합니다.
Oracle 버전 12.2 이상을 사용하는 경우 다음을 사용하여 해당 형식 마스크를 사용하여 날짜로 변환 할 수없는 데이터를 포함하는 모든 행을 식별 할 수 있습니다 validate_conversion
.
select
from datos_fondospol
where validate_conversion(venctarjeta as date, 'MMYY') = 0
이 데이터가 정확하지만 무시해도 안전하다면 다른 12.2 추가를 사용할 수 있습니다.
SELECT
TO_DATE(FONDOS.VENCTARJETA, 'MMYY') AS F_VENCIMIENTO
FROM
POLIZA POLIZA,
DATOS_FONDOSPOL FONDOS
WHERE
POLIZA.IDEPOL = FONDOS.IDEPOL AND
TO_DATE(FONDOS.VENCTARJETA default null on conversion error, 'MMYY') <= SYSDATE AND
POLIZA.CODINTER = TO_NUMBER(:P2_CLAVE)
12.1에만있는 경우 with plsql
절을 사용하여 유사한 기능을 직접 만들 수 있습니다 .
with
function default_date(dateString varchar2,dateFormat varchar2)
return date
is
convertedDate date;
begin
convertedDate := to_date(dateString,dateFormat );
return convertedDate ;
exception when others then
return null;
end;
SELECT
TO_DATE(FONDOS.VENCTARJETA, 'MMYY') AS F_VENCIMIENTO
FROM
POLIZA POLIZA,
DATOS_FONDOSPOL FONDOS
WHERE
POLIZA.IDEPOL = FONDOS.IDEPOL AND
default_date(FONDOS.VENCTARJETA, 'MMYY') <= SYSDATE AND
POLIZA.CODINTER = TO_NUMBER(:P2_CLAVE)
그보다 적은 경우 PL / SQL 함수를 명시 적으로 만들고 호출 할 수 있습니다. 또는 case
먼저 문자열의 내용을 확인 하는 표현식을 만들 수 있습니다.
SELECT
TO_DATE(FONDOS.VENCTARJETA, 'MMYY') AS F_VENCIMIENTO
FROM
POLIZA POLIZA,
DATOS_FONDOSPOL FONDOS
WHERE
POLIZA.IDEPOL = FONDOS.IDEPOL AND
case when regexp_like (FONDOS.VENCTARJETA, '^[0-9]{4}$')
and to_number(substr(FONDOS.VENCTARJETA,1,2)) between 1 and 12
then to_date(FONDOS.VENCTARJETA, 'MMYY') else cast(null as date) end <= SYSDATE AND
POLIZA.CODINTER = TO_NUMBER(:P2_CLAVE)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다