자바의 Date 타입과 JDBC의 Date 타입
자바내에서도 두 개의 Date 타입이 존재한다.
  java.util.Date utilDate = new java.util.Date();
  java.sql.Date sqlDate = new Date(utilDate.getTime());

  System.out.println(utilDate.toString());
  System.out.println(sqlDate.toString());



출력 결과는
Wed Apr 26 13:25:44 KST 2006
2006-04-26

java.sql.Date는 java.util.Date와 달리 디폴트 생성자로 초기화 할 수 없다. util의 Date가 기본적인 시간 정보를 책임진다면, sql은 JDBC용 형식처리 역할을 한다고 유추할 수 있다. DB에 넣는 데이터값이라면 포맷터 없이도 아래처럼 출력되면 좋으니까..

이번에는 Hsql이 제공하는 다양한 JDBC의 Date 타입을 이용해서 동일한 java.util.Date를 넣어보고 결과를 비교해보겠다.

Date, Timestamp(Timestamp(6)과 동일), Timestamp(0), Datetime 등으로 동일한 날짜를 넣어놓고, SELECT 해서 비교해보면 재미있를 결과문을 볼 수 있다.
java.lang.AssertionError: expected:<2006-04-26> but was:<2006-04-26>

비록 toString()으로 출력될 때는 java.sql.Date를 따르게 되어 동일하게 보이지만, 실은 다른 숫자(long)을 갖고 있다는의미인데.. 나머지는 모두 성공하고..Date의 경우만 예외가 발생한다.
AssertUtils.equals(sqlDate, dateInDate);

어서트 구문을 바꿔보면 성공한다.
AssertUtils.isTrue(sqlDate.getTime() > dateInDate.getTime());

이것이 의미하는 바는 Date 타입으로 데이터베이스에 넣는 경우 값이 잘린다는 것인데, Hsql의 경우 Date와 Time을 나눠서 저장하는 모양이다. 그래서 Date라고 하면 날짜 까지의 데이터만 저장하는 듯 하다.(오라클 Date와는 다름)

이번에는 java.util.Date에 비해 누락되는 값은 없는지 확인해본다.
  AssertUtils.equals(utilDate.getTime(), dateInDate.getTime());
  AssertUtils.equals(utilDate.getTime(), dateInTIMESTAMP.getTime());
  AssertUtils.equals(utilDate.getTime(), dateInDATETIME.getTime());
  AssertUtils.equals(utilDate.getTime(), dateInTIMESTAMP0.getTime());

첫번째 구문은 Date 타입 칼럼에 저장된 값이니 당연히 갖지 않다.
java.lang.AssertionError: expected:<1146026619695> but was:<1145977200000>

나머지는 동일했다. 결국 Date만 아니면, TIMESTAMP나 DATETIME 중 어떤 것을 사용해도 안전하다는 것이다. 초단위까지만 저장하겠다면 TIMESTAMP 보다는 TIMESTAMP(0)이 적절하다.





















































by 바르 | 2007/01/11 20:32 | 트랙백(1) | 덧글(0)
트랙백 주소 : http://computer.egloos.com/tb/798164
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from 이지홍의 행복한 공간 at 2007/01/16 09:37

제목 : 자바Tip 날짜구하기 총집합!
[ 날짜 연산법 ] 가. 이해 및 유틸 - 시스템 시간에 대한 이해 - 날짜 계산 종합 유틸리티 나. 응용팁 시스템의 밀리초 구하기.(국제표준시각(UTC, GMT) 1970/1/1/0/0/0 으로부터 경과한 시각) ------------------------------------------------------------------ // 밀리초 단위(*1000은 1초), 음수이면 이전 시각 long time ......more

:         :

:

비공개 덧글



<< 이전 페이지 다음 페이지 >>