source

Oracle TO_DATE NOT throw 오류

nicesource 2023. 8. 2. 09:14
반응형

Oracle TO_DATE NOT throw 오류

방금 format_mask 매개 변수와 함께 사용할 때 oracle TO_DATE 함수의 이상한 동작을 발견했습니다.

기본적으로, 제가 본 것은 어떤 경우에는 주어진 포맷 마스크를 무시하고, 어떤 경우에는 자신의 마스크로 입력을 구문 분석하고, 다른 경우에는 예외를 던집니다.

: 예상된 동작 - 오류 발생:

SELECT TO_DATE('18-02-2016', 'DD/MON/YYYY') FROM dual

ORA-01843: 유효한 달이 아닙니다.

II 예기치 않은 동작 - 구문 분석된 날짜:

SELECT TO_DATE('18-feb-2016', 'DD/MM/YYYY') FROM dual

2016년 2월 18일 00:00:00

문서에서 이에 대한 어떠한 언급도 볼 수 없는데, 저는 이 부적절함이 의도적인 것인지 아니면 버그인지, 아니면 제가 무엇을 정확하게 이해하지 못하는 것인지 궁금합니다.

편집: 답변을 보면 아마도 설계에 의한 것이라는 것에 동의할 수 있습니다.하지만 여기서 하는 일은 위험할 정도로 "자동적"으로 보입니다.

형식이 잘못 해석될 경우(오라클로 추측) 어떻게 됩니까?안전하다고 확신할 수 있도록 정확히 여기서 무슨 일이 일어나고 있는지에 대한 문서가 있습니까?

제 질문은 - 제가 끌 수 있을까요?형식을 확인하는 것이 나의 유일한 옵션입니까?

다음 표를 참조하십시오. https://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements004.htm#g195479

이 규칙은 Datetime 형식 모델의 String-To-Date 변환 규칙 섹션의 일부입니다.의 경우에는MM일치하는 것이 없다면, 그것은 시도합니다.MON그리고.MONTH유사하게 지정할 경우MON그리고 그것을 찾지 못하고 시도합니다.MONTH지정하는 경우MONTH그리고 그것을 찾을 수 없습니다, 시도합니다.MON하지만 절대 시도하지 않을 겁니다MM을 제외한 모든 것에.MM.

질문에 대한 답변:Can I turn it off?답은 '그렇다'입니다.

다음을 지정하여 이를 수행할 수 있습니다.FX형식 지정의 일부로 사용합니다.

SELECT TO_DATE('18/february/2016', 'FXDD/MM/YYYY') FROM dual;

이제 반환:

[오류] 실행(4:16): ORA-01858: 숫자가 예상되는 숫자가 아닌 문자가 발견되었습니다.

반면에 다음은.

SELECT TO_DATE('18/02/2016', 'FXDD/MM/YYYY') FROM dual;

예상된 값을 반환합니다.

2/18/2016

다음을 지정할 때 주의하십시오.FX올바른 구분 기호를 사용해야 합니다. 그렇지 않으면 오류가 발생합니다.

이것은 의도적인 것입니다.Oracle은 정의된 마스크를 준수하지 않더라도 문자열에서 결정론적인 날짜 표현을 찾으려고 합니다.결정적인 날짜를 찾지 못하거나 날짜의 일부 필수 구성 요소가 누락되었거나 해결되지 않은 경우에만 오류가 발생합니다.

내 생각엔02, 월날/년의/을할수있만지미짜,feb오직 한 가지를 의미할 것입니다.month 저는 또한나는것교확다니습인했차을은같에서 같은 을 교차 했습니다.11g그리고 당신이 받은 것과 같은 출력을 받았습니다.12c오라클 디자인이어야 합니다.

Oracle이 유용하게 사용할 수 없도록 설정하고 정확하게 일치하지 않는 내용을 해석하려면 FX 형식 수정자를 사용할 수 있습니다.

FX
형식이 정확합니다.는 TO_DATE 와 날짜/시간 하게 일치하도록 합니다.

  • 문자 인수의 구두점 및 따옴표로 묶인 텍스트는 형식 모델의 해당 부분과 정확하게 일치해야 합니다(대소문자 제외).
  • 문자 인수에는 공백을 추가할 수 없습니다.FX가 없으면 Oracle은 추가 공백을 무시합니다.
  • 문자 인수의 숫자 데이터는 형식 모델의 해당 요소와 자릿수가 같아야 합니다.FX가 없으면 문자 인수의 숫자에서 선행 0을 생략할 수 있습니다.
  • FX가 활성화된 경우 FM 수식어를 사용하여 선행 0에 대한 이 검사를 비활성화할 수도 있습니다.

따라서 다음과 같은 오류가 발생할 수 있습니다.

SELECT TO_DATE('18-feb-2016', 'FXDD/MM/YYYY') FROM dual;

SQL Error: ORA-01858: a non-numeric character was found where a numeric was expected

또한 구분 기호가 정확하게 일치해야 합니다.

SELECT TO_DATE('18-02-2016', 'FXDD/MM/YYYY') FROM dual;

SQL Error: ORA-01861: literal does not match format string

제대로 이해하면 됩니다.

SELECT TO_DATE('18/02/2016', 'FXDD/MM/YYYY') FROM dual;
SELECT TO_DATE('18-feb-2016', 'FXDD-MON-YYYY') FROM dual;

두 번째 예에서는 다른 경우에 대해 불평하지 않습니다.그러나 선행 0을 생략하면 불만이 제기됩니다.

SELECT TO_DATE('18/2/2016', 'FXDD/MM/YYYY') FROM dual;

SQL Error: ORA-01862: the numeric value does not match the length of the format item

FM 수식어를 포함하지 않는 한:

SELECT TO_DATE('18/2/2016', 'FMFXDD/MM/YYYY') FROM dual;

언급URL : https://stackoverflow.com/questions/34744251/oracle-to-date-not-throwing-error

반응형