[Oracle] ORA-01850: hour must be between 0 and 23

calico·2025년 8월 1일

Error

목록 보기
5/10

참고

ORA-01850: hour must be between 0 and 23 에러


에러 원인


  • startTime = syncTime + "0000"

    • 예: 20230801 + "0000"202308010000
  • endTime = requestTime + "5959"

    • 예: 20230801 + "5959"202308015959
  • "0000"00시 00분

  • "5959"59시 59분

    59시는 존재하지 않으므로 오라클에서 ORA-01850 에러가 발생합니다.



올바른 날짜/시간 포맷


  • 오라클의 TO_DATE('YYYYMMDDHH24MISS', ...)

    • HH24: 0~23

    • MI: 0~59

    • SS: 0~59

  • 시작: 000000 (00시 00분 00초)

  • 종료: 235959 (23시 59분 59초)



에러 해결 방법


기존 코드


String startTime = syncTime + "0000";
String endTime = requestTime + "5959";



수정 코드

requestTime 지정을 시간까지 넣으면 되긴 함


String startTime = syncTime + "000000";   // 00시 00분 00초
String endTime = requestTime + "235959";  // 23시 59분 59초



  • 코드에서 작은따옴표(')도 포함시켜야 합니다.
.append("EQ_REPAIR_START_DATE BETWEEN TO_DATE('")
.append(startTime)
.append("', 'YYYYMMDDHH24MISS') AND TO_DATE('")
.append(endTime)
.append("', 'YYYYMMDDHH24MISS')")



실무 적용 예시



if (requestTime == null || requestTime.trim().isEmpty()) {
    requestTime = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
    log.info("requestTime 파라미터가 없어 기본값({})을 사용합니다.", requestTime);
}
String syncTime = BatchProperties.facilitiesPauseJobSynchronizedTime;
if (syncTime == null || syncTime.trim().isEmpty()) {
    syncTime = requestTime;
    log.info("facilitiesPauseJobSynchronizedTime이 없어 기본값({})을 사용합니다.", syncTime);
}

String startTime = syncTime + "000000";
String endTime = requestTime + "235959";

String query = "SELECT ... WHERE EQ_REPAIR_START_DATE BETWEEN TO_DATE('" + startTime + "', 'YYYYMMDDHH24MISS') AND TO_DATE('" + endTime + "', 'YYYYMMDDHH24MISS')";

  • 5959는 잘못된 시간 값이므로 반드시 235959로 바꿔야 합니다.

  • 오라클 날짜 포맷에 맞게 시작은 000000, 종료는 235959로 맞추세요.

  • 쿼리 파라미터에 작은따옴표(')도 꼭 포함시키세요.

  • 이렇게 수정하면 ORA-01850 에러 없이 정상적으로 배치가 동작합니다!

    • 실제 쿼리 로그도 꼭 확인





0개의 댓글