쥬로그

java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff] 본문

Error

java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]

쥬쥬씨 2022. 1. 17. 00:04
반응형

오라클 DB - JAVA

>> 원하는 형식으로 날짜 데이터 출력하기

 

문제 발생

Date 타입으로 logtime이라는 컬럼을 생성하고, DTO에서도 Date 데이터 타입으로 필드를 만들었다.

그리고 java에서 출력 쿼리문을 아래와 같이 작성했다.

to_char(logtime, 'yyyy.mm.dd') as logtime

 

String으로 필드를 생성했을때는 정상적으로 날짜가 출력됐는데, Date 타입으로 필드를 생성하니

 java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss [. fffffffff] 에러가 났다.

 

Timestamp가 아닌데 왜 Timestamp format은 반드시 yyyy-dd hh:mm:ss로 맞추라는 걸까? 싶어서

to_char(logtime, 'yyyy-mm-dd hh:mm:ss') as logtime

이렇게 코드를 변경해보았다.

에러는 나지 않았지만, 내가 원하는 값이 출력되지 않았다.

날짜가 출력되지 않고, Object가 표시된다.

 

그럼 to_char를 뺀

(logtime, 'yyyy-mm-dd hh:mm:ss') as logtime

위 코드로 실행하면 어떻게 될까?

missing right parenthesis 이라는 에러가 발생했다.

 

to_date를 앞에 추가해보았다.

to_date(logtime, 'yyyy-mm-dd hh:mm:ss') as logtime

format code appears twice 라는 에러가 발생했다.

 

그럼 아예 format을 다 빼버리면 어떻게 될까?

logtime

logtime으로만 실행하면 에러는 발생하지 않지만, Object라고 또 출력된다.

 

이래저래 에러가 발생하거나 object가 출력된다.

logtime 필드 데이터타입이 Date니까, date 형식을 가져오면서도 format은 주어줘야 되는데,,,

어떻게 하면 내가 원하는 날짜가 출력될까?

 

해결하기

우선, 쿼리문에서 to_char를 사용하지 않았다.

DTO 필드 데이터타입도 Date니까 to_char로 가져오면 필드에 값이 저장되지 않을 거라 생각했다.

logtime 그대로 컬럼명에 사용하여 쿼리문을 날려 데이터를 가져왔고

Date 형식을 format에 맞게 출력하기 위해 SimpleDateFormat 를 사용했다.

String format = "yyyy.MM.dd";
SimpleDateFormat sdf = new SimpleDateFormat(format);
temp.put("logtime", sdf.format(boardDTO.getLogtime().getTime()));

Service에서 위와 같이 처리하였더니!

 

 

드디어 내가 원하는 형식으로 출력되었다.

여기서 또, 주의할 점은 format 지정 시 대문자 M을 사용해야 된다는 것이다.

소문자 m은 24시간을 나타낼 때 사용되기 때문에 꼭! 꼭! M을 사용하도록 하자.

 

정리하기

java.lang.IllegalArgumentException

메서드가 잘못되었거나 부적절한 인수가 전달되었음을 나타내기 위해 발생하는 예외

 

to_char 함수

date 데이터 타입이 가지는 기본 형태를 사용자의 편의에 따라 출력하고 싶을 때 사용

반응형