'SQL Server'에 해당되는 글 1건

  1. 2014.01.19 SQL Server Java7 날짜 문제
Database/SQL Server2014. 1. 19. 02:28
반응형

 SQL Server(MSSQL)와 jdbc를 이용하여 프로그램 개발을 하던중 날짜가 2일씩 차이가 나는 현상이 발생해서 원인을 찾아보았다. 정확한 원인을 찾아보기위해 일단 일단 증상을 명확히 해보기로 하고 SQL Server에서 제공하는 시간 관련한 데이터 타입을 확인해 보았다. MSDN을 확인해본 결과 2012버전 기준으로 다음과 같은 6가지 타입을 제공하고 있었다.


 DATE 

 길이:10, 크기:3byte(고정), 정확도:1일, 범위 0001년1월1일~9999년12월31일

 DATETIME

 길이:19-23, 크기:8byte, 정확도:.000, .003 또는 .007초 단위 반올림,
 범위:1753년 1월 1일~9999년 12월 31일

 DATETIME2

 길이:19-27, 크기:6-8byte, 정확도:최대 100ns[각주:1]
 범위:0001년1월1일~9999년12월31일

 SMALLDATETIME

 길이:19, 크기:4byte(고정), 정확도:1분,범위:1900년1월1일~2079년6월6일

 TIME

 길이:8-16(소수점아래 지정 가능), 크기:최대5byte, 정확도:100ns

 DATETIMEOFFSET

 길이:19-27, 크기:6-8byte, 정확도:최대 100ns
 범위:0001년1월1일~9999년12월31일, 타임존 지원

 


 위의 6가지 데이터 타입각각에 대해 증상이 발생하는지 직접 확인하기 위해서 아래와 같이 테이블을 생성하고 현재 시각으로 데이터를 삽입 했습니다.


CREATE TABLE TESTDATE(
    dt1 SMALLDATETIME
    ,dt2 DATETIME
    ,dt3 DATE
    ,dt4 DATETIMEOFFSET
    ,dt5 DATETIME2
    ,dt6 TIME
);

INSERT INTO TESTDATE(
    dt1
    ,dt2
    ,dt3
    ,dt4
    ,dt5
    ,dt6
) VALUES (
    GETDATE()
    ,GETDATE()
    ,GETDATE()
    ,GETDATE()
    ,GETDATE()
    ,GETDATE()
);
 
 위처럼 각 데이터 타입에 대해서 같은 시간을 세팅한 후 간단한 어플리케이션(mybatis이용)을 구성해서 데이터를 가져와 보았다.

dt1=2014-01-19 01:59:00.0
dt2=2014-01-19 01:58:54.88
dt3=2014-01-17
dt4=2014-01-17 01:58:54.88 +00:00
dt5=2014-01-17 01:58:54.88
dt6=01:58:54


 간단하게 셀렉트한 결과를 출력해 본 결과 DATE, DATETIMEOFFSET, DATETIME2 세가지 데이터 타입인 경우 날짜가 2일 전으로 출력되는 것을 알 수 있다. 다음으로 SQL Server에서 제공하는 시간펑션을 이용해서 데이터를 출력해 보았다. 물론 자바라는 같은 환경을 유지하기 위해 eclipse플러그인인 sql explorer를 이용하였다.

SELECT
    SYSDATETIME()
    ,SYSDATETIMEOFFSET()
    ,SYSUTCDATETIME()
    ,GETDATE()
    ,GETUTCDATE();

 



마찬가지로 시간차가 나타나는 결과가 출력되었다.

※ 위 결과중 UTC가 붙은 펑션의 결과는 국제 표준시간대의 시간이므로 추가적으로 우리나라 표준시 에서 9시간 차가 있음


  첫번째 테스트 결과에서 알수 있는점은 바로 시간차가 나타나는 세가지 케이스는 모두 정확도가 100ns인 경우라는 것이다.

  두번재 테스트 결과에서 역시 시간차가 있는 결과는 모두 반환 타입이 DATETIMEOFFSET이거나 DATETIME2인 경우이므로

마찬가지 결과였다.


  문제 해결은 의외로 간단하게 해결되었다. 검색중에 msdn사이트에서 hotfix jre7이라는 단어를 발견한 것이었다. 어플리케이션에 포함되어있던 jdbc버전을 3에서 최신릴리스인 버전4로 업그레이드 해보았다.

아래처럼 정상적인 결과가 출력되는 것을 확인할 수 있었다.


dt1=2014-01-19 01:59:00.0
dt2=2014-01-19 01:58:54.88
dt3=2014-01-19
dt4=2014-01-19 01:58:54.88 +00:00
dt5=2014-01-19 01:58:54.88
dt6=01:58:54



jdbc버전4에 함께 포함된 릴리즈 정보에서 아래와 같은 구절도 확인할 수 있었다.

2084385 이제 JRE 1.7에서 getDate, getTimestamp, getDateTimeOffset은 모든 날짜에 대해 올바른 값을 반환합니다.


jdbc처럼 일반적으로 공개되있으며 필수적인 라이브러리를 이용해서 프로젝트를 진행할 때는 항상 어플리케이션의 환경 변화에 따라 항상 라이브러리의 릴리즈 정보를 확인해야 할 필요성을 느끼게 되었습니다.


  1. 나노초 [본문으로]
Posted by Reiphiel