IT

ORA-01843은 유효한 달이 아닙니다.비교일

itgroup 2023. 2. 10. 21:45
반응형

ORA-01843은 유효한 달이 아닙니다.비교일

날짜별로 필터링된 테이블에서 데이터를 선택하려고 할 때 문제가 있습니다.

예를 들어 다음과 같습니다.

SELECT * FROM MYTABLE WHERE MYTABLE.DATEIN = '23/04/49';

Oracle 오류:

Informe de error:
Error SQL: ORA-01843: mes no válido
01843. 00000 -  "not a valid month"
*Cause:    
*Action:

이 경우 테이블의 소스 데이터가 파손되었을 수 있습니다.

  • 어떻게 하면 이 문제를 해결할 수 있을까요?
  • 이 날짜를 null로 변경할 수 있습니까?

이 선택 결과,select * from nls_session_parameters;는 다음과 같습니다.

PARAMETER                      VALUE                                  
------------------------------ ----------------------------------------
NLS_LANGUAGE                   SPANISH                                  
NLS_TERRITORY                  SPAIN                                    
NLS_CURRENCY                   ¿                                        
NLS_ISO_CURRENCY               SPAIN                                    
NLS_NUMERIC_CHARACTERS         ,.                                       
NLS_CALENDAR                   GREGORIAN                                
NLS_DATE_FORMAT                DD/MM/RR                                 
NLS_DATE_LANGUAGE              SPANISH                                  
NLS_SORT                       SPANISH                                  
NLS_TIME_FORMAT                HH24:MI:SSXFF                            
NLS_TIMESTAMP_FORMAT           DD/MM/RR HH24:MI:SSXFF                   
NLS_TIME_TZ_FORMAT             HH24:MI:SSXFF TZR                        
NLS_TIMESTAMP_TZ_FORMAT        DD/MM/RR HH24:MI:SSXFF TZR               
NLS_DUAL_CURRENCY              ¿                                        
NLS_COMP                       BINARY                                   
NLS_LENGTH_SEMANTICS           BYTE                                     
NLS_NCHAR_CONV_EXCP            FALSE 

를 사용해야 합니다.to_date기능(function/filename/to_date.filename)

SELECT * FROM MYTABLE WHERE MYTABLE.DATEIN = TO_DATE('23/04/49', 'DD/MM/YY');

날짜 열을 문자열 리터럴과 비교하고 있습니다.이 경우 Oracle은 기본 날짜 형식을 사용하여 리터럴을 날짜로 변환하려고 합니다.이러한 동작에 의존하는 것은 좋지 않습니다.DBA가 일부 구성을 변경하거나 Oracle이 향후 리비전에서 문제가 발생할 경우 이 기본값이 변경될 수 있습니다.

대신 항상 리터럴을 날짜로 명시적으로 변환하고 사용 중인 형식을 명시해야 합니다.

SELECT * FROM MYTABLE WHERE MYTABLE.DATEIN = TO_DATE('23/04/49','MM/DD/YY');

정확한 타임스탬프를 확인할 필요가 없는 경우,

SELECT * FROM MYTABLE WHERE trunc(DATEIN) = TO_DATE('23-04-49','DD-MM-YY');

그렇지 않으면

SELECT * FROM MYTABLE WHERE DATEIN = TO_DATE('23-04-49 20:18:07','DD-MM-YY HH24:MI:SS');

여기서는 하드코드 날짜를 사용합니다.직접 비교할 경우 DD-MM-YY HH24를 사용해야 합니다.MI:SS 이외의 경우 ORA-01849: 시간은 1에서 12 사이여야 합니다.

좀 늦은 건 알지만 비슷한 문제가 있어요. SQL*Plus쿼리는 정상적으로 실행되지만Oracle SQL Developer를 나타냅니다.ORA-01843: not a valid month error.

SQL*PlusOracle SQL Developer는 내 날짜가 어떤 형식인지 명시적으로 알려줘야 하는 반면, 사용 중인 날짜가 유효한 형식임을 알고 있는 것 같습니다.

  • 다음과 같습니다SQL*Plus statement.

    select count(*) from some_table where DATE_TIME_CREATED < '09-12-23';
    

  • 다음과 같습니다Oracle SQL Developer statement.

     select count(*) from some_table where DATE_TIME_CREATED < TO_DATE('09-12-23','RR-MM-DD');
    

혹시나 해서 서버 날짜 형식을 확인했습니다.

SELECT * FROM nls_session_parameters WHERE parameter = 'NLS_DATE_FORMAT';

그런 다음 다음 비교를 사용합니다(왼쪽 필드는 날짜+시간).

AND EV_DTTM >= ('01-DEC-16')

이거랑 같이 해봤는데TO_DATE계속 오류가 났어요.하지만 내가 내 끈을 그 끈과 연결시켰을 때NLS_DATE_FORMAT및 제거됨TO_DATE, 효과가 있었습니다...

답변 중 하나에 대한 코멘트에서는 형식을 사용한 to_date는 도움이 되지 않습니다.또 다른 코멘트에서는 DBLINK를 통해 테이블에 액세스하는 것을 설명합니다.

따라서 다른 시스템에 Oracle이 받아들일 수 없는 잘못된 날짜가 포함되어 있는 것이 분명합니다.다른 dbms(또는 dblink 대상)에서 이를 수정하면 쿼리가 작동합니다.

이 점은 동의하지만 to_date는 항상 문자열 리터럴을 날짜로 변환하는 형식으로 사용합니다.또한 1년 동안 두 자리 숫자만 사용하지 마십시오.예를 들어 '23/04/49'는 시스템에서 2049를 의미하지만(R을 포맷함), YY를 사용한 포맷을 제안하는 답변에서 볼 수 있듯이) 판독기를 혼란스럽게 합니다.

원본 날짜에 분 및 초 부분이 포함되어 있으면 날짜 비교가 실패합니다.to_char를 사용하여 소스 날짜를 필요한 형식으로 변환해야 합니다.또, 타겟 날짜도 필요합니다.

명령줄 도구를 사용하는 경우 셸에서도 설정할 수 있습니다.

Linux에서 sh type 쉘을 사용하면 다음과 같은 작업을 수행할 수 있습니다.

export NLS_TIMESTAMP_FORMAT='DD/MON/RR HH24:MI:SSXFF'

그런 다음 명령줄 도구를 사용할 수 있으며 지정된 형식을 사용합니다.

/path/to/dbhome_1/bin/sqlldr user/pass@host:port/service control=table.ctl direct=true

사용 방법:

SELECT *
FROM MYTABLE
WHERE MYTABLE.DATEIN is not null 
AND MYTABLE.DATEIN = '23/04/49';

하다를 사용하세요.month스트링으로.

예:

(12-Apr-2002) or (12-April-2002)

TO_DATE를 사용한 답변은 맞지만 날짜에는 ANSI SQL 형식을 사용하는 것이 좋습니다.

DATEIN = DATE '1949-04-23'

Oracle 및 기타 DBMS ANSI SQL 호환에서 작동합니다.이는 응용 프로그램이 DBMS에 의존하지 않는 경우 특히 중요합니다.

세션 세트 NLS_DATE_FORMAT='DD/MM/Y' 또는 원하는 형식을 변경해 보십시오.

PROD에서는 모든 코드가 이미 이 포맷으로 되어 있었지만 프리로드에서는 설정되어 있지 않기 때문에 Oracle에서 사용하는 기본 날짜 형식을 변경할 수 있습니다.

ALTER 세션 세트 NLS_LANGUAGE='American';

언급URL : https://stackoverflow.com/questions/21157224/ora-01843-not-a-valid-month-comparing-dates

반응형