ORA-01849: 시간은 1에서 12 사이여야 합니다.
WHERE (ResTRRequest.RequestTime BETWEEN TO_CHAR(TRUNC(TO_DATE('2012-12-01 20:10:10', 'HH')), 'YYYY-MM-DD HH24:MI:SS')
AND TO_CHAR(TRUNC(CURRENT_TIMESTAMP, 'HH') + INTERVAL '59:59' MINUTE TO SECOND, 'YYYY-MM-DD HH24:MI:SS'))
위의 쿼리 조건은 실행 시 sysdate를 적용하면 정적 날짜로 인해 1~12시간 사이여야 합니다. 즉, "2012-12-01 20:10", "HH"")이 정상 작동하지만 정적 날짜로 인해 오류가 발생합니다.
이 문제를 조금 설명해 보겠습니다.
WHERE (ResTRRequest.RequestTime
BETWEEN TO_CHAR(TRUNC(TO_DATE('2012-12-01 20:10:10', 'HH')), 'YYYY-MM-DD HH24:MI:SS')
AND TO_CHAR(TRUNC(CURRENT_TIMESTAMP, 'HH') + INTERVAL '59:59' MINUTE TO SECOND, 'YYYY-MM-DD HH24:MI:SS'))
애초에 이런 뜻은 아닌 것 같습니다.TRUNC(TO_DATE('2012-12-01 20:10:10', 'HH'))
아마 이런 뜻일 거예요TRUNC(TO_DATE('2012-12-01 20:10:10'), 'HH')
1-12 오류의 숫자는 1시간의 시간이 있다는 사실에서 나온 것입니다.20
그리고 그것을 의 가면을 쓴 데이트로 전환하려고 노력하고 있습니다.HH
하지만 제가 말했듯이, 저는 그것이 오타라고 생각합니다.사용할 수도 있습니다.TIMESTAMP
보다 문자 그대로의TO_DATE()
:
TRUNC(TIMESTAMP'2012-12-01 20:10:10', 'HH')
둘째, 이 문제를 해결하기 위해 날짜나 타임스탬프를 문자열로 저장하고 있습니까?그것은 좋은 생각이 아닙니다.
셋째, 사용하는 것은 좋은 생각이 아닙니다.BETWEEN
날짜 비교에서 에지 케이스를 놓칠 수 있습니다.다음과 같이 다시 작성하는 것이 좋습니다.
WHERE ( ResTRRequest.RequestTime >= TO_CHAR(TRUNC(TO_DATE('2012-12-01 20:10:10'), 'HH'), 'YYYY-MM-DD HH24:MI:SS')
AND ResTRRequest.RequestTime < TO_CHAR(TRUNC(CURRENT_TIMESTAMP, 'HH') + INTERVAL '1' HOUR, 'YYYY-MM-DD HH24:MI:SS') )
마스크에 문제가 있습니다.
TO_DATE('2012-12-01 20:10:10', 'HH')
다음 항목으로 대체:
TO_DATE('2012-12-01 20:10:10', 'HH24')
라고 가정하면ResTRRequest.RequestTime
날짜 유형, 이것입니다.Where
절이 작동합니다.
where ResTRRequest.RequestTime
BETWEEN TRUNC(TO_DATE('2015-02-26 20:10:10', 'YYYY-MM-DD HH24:MI:SS'), 'HH')
AND TRUNC(CURRENT_TIMESTAMP, 'HH') + INTERVAL '59:59' MINUTE TO SECOND
문자 표현을 비교해야 하는 경우 사전순으로 비교해야 합니다. 즉, 문자열의 접두사가 문자열 앞에 정렬됩니다.유의성이 감소하는 순서대로 성분이 배열된 동일한 형식 지정 모형을 사용하여 복잡성이 발생하지 않도록 합니다.예.
TO_CHAR(<whatever>, 'YYYY-MM-DD HH24:MI:SS')
하지만 아닙니다.
TO_CHAR(<whatever>, 'MM/DD/YYYY HH24:MI:SS')
Oracle의 언어 설정이 12시간을 사용하도록 설정된 경우 24시간 형식을 변환할 때 이 문제가 발생합니다.이에 대한 두 가지 해결책이 있습니다.
Oracle 클라이언트에서 TIMESTAMP/DATE 형식 변환
세션 세트 nls_message_format=' 변경YYY-MM-DD HH24:MI:SS.FF6';
쿼리를 24시간 형식과 일치하도록 변환
선택 * FROM TEST _ WHERE DOB > TRUNK (타임스탬프 '1970-01-01 20:10:10', 'HH'); 또는
* FROM TEST _ WHERE DOB > to_date('1970-01-01 20:00:00', YYY-MM-DD HH24:MI:SS';
이 오류가 발생할 경우 한 가지 더 주의해야 할 점은 데이터 자체입니다.이 형식 지정자 'MM/dd/YYYH:MI:SSAM'을 사용하여 구문 분석하고 TO_DATE로 변환해야 하는 xml 태그에 날짜가 저장되어 있습니다. 일부 레코드가 "12/20/2017 16:45:00 PM"으로 작성되었기 때문에 SQL이 "ORA-01849:hour는 1에서 12 사이여야 합니다."로 중단되었습니다.16h 및 PM 지정기에 주의하십시오...
언급URL : https://stackoverflow.com/questions/28742134/ora-01849-hour-must-be-between-1-and-12
'programing' 카테고리의 다른 글
LaTeX를 R 그림으로 가져오기 (0) | 2023.06.30 |
---|---|
Tomcat 또는 Jetty Production 등급이 내장된 Spring Boot입니까? (0) | 2023.06.30 |
Angular 4 표현식이 확인된 후 변경됨 오류 (0) | 2023.06.30 |
상대 URL을 전체 URL로 변환하려면 어떻게 해야 합니까? (0) | 2023.06.30 |
트위터 부트스트랩 툴팁을 동적으로 생성된 요소에 바인딩하려면 어떻게 해야 합니까? (0) | 2023.06.30 |