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*Plus
Oracle 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
'IT' 카테고리의 다른 글
관리 페이지에서 페이지에 사용되는 Wordpress 템플릿 확인 (0) | 2023.02.10 |
---|---|
서브디렉토리에서 앱을 처리하도록 create-react-app을 설정하려면 어떻게 해야 합니까? (0) | 2023.02.10 |
Oracle에서 테이블, 뷰 및 동의어에 대한 모든 인덱스와 해당 열을 찾는 방법 (0) | 2023.02.10 |
Json 결과가 객체인지 어레이인지 확인합니다. (0) | 2023.02.10 |
하나의 요청에 대한 HTTP 헤더 설정 (0) | 2023.02.10 |