까막군's 주접 블로그

검색 :
RSS 구독 : 글 / 댓글 / 트랙백 / 글+트랙백

[MSSQL] C++ / time_t , SQL / SMALLDATETIME 비교

2009/04/13 17:59, 글쓴이 까막군

=============================================
작성자 : 최용수
작성일 : 2009-04-14
라이센스 : 암때나 퍼가시고 출처만 적어주세요..굽신굽신
=============================================


< Issue >

Window/Unix C++  Application에서 사용하는 time_t  구조체(4byte)를 Binary로 저장할 경우,
Database 상에서 DateTime 형으로 Cast 되지 않는 현상 발견

ex)
SELECT CAST(time_t binary value  AS SMALLDATETIME)
 --// 오류 발생 ,

< solution >

전제 :
    1. C++에서 사용되는 time 함수의 time_t 구조체의 값은 1970-01-01 부터의 경과시간을 리턴한다.
    2. Database 상의 CAST(CAST(GetDate() AS SMALLDATETIME) AS VARBINARY(4)) 의 값은 일반 TimeStamp 값처럼 기준일 이후의 경과 시간이 아니다. (참고로 SMALLDATETIME의 기준일은 1900-01-01 이다.)

해결 :
    1. time_t 값에 1900-01-01 ~ 1970-01-01 동안의 경과시간을 더한다.
    2. 또는 1과 달리 time_t 값을 Database에서 1970-01-01 에다 더하여 Cast 해서 SmallDateTime을 구한다.

< attention 1 >

1900-01-01 ~ 1970-01-01 사이의 경과 시간을 구할때 윤년을 빼먹지 말자. 윤년은 366일이다.
계산결과 총 36816480 분이 경과되며 이것을 초로 환산할 시 2208988800 이 된다.

< attention 2 >

MSSQL의 Timestamp 값이 표준이 아니다. 따라서 DateTime / SmallDataTime의 CAST 된 BINARY 값이 Windows Timestamp / Unix Timestamp 라고 판단 할 수 없다.  실제로 오류가 발생한다. (MSSQL의 timestamp가 경과 시간이 아니라는 뜻)

따라서 1970-01-01 에  Unix/Windows Timestamp 값을 DATEADD(s , timestamp_value , DateTime) 으로 구하는 방식을 사용하여 날짜를 구하는 방식으로 진행한다. 역으로 Database에서 unix/windows의 timestamp를 구할때 CAST(SMALLDATETIME AS VARBINARY(4)) 로 된 값을 전송하지 말고, DATEDIFF를 써서 1970-01-01 부터 경과된 Second 값을 binary로 변환하여 전달하는것이 맞다.

크리에이티브 커먼즈 라이센스
Creative Commons License
2009/04/13 17:59 2009/04/13 17:59

맨 위로