=============================================
작성자 : 최용수
작성일 : 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로 변환하여 전달하는것이 맞다.
[MSSQL] C++ / time_t , SQL / SMALLDATETIME 비교
binary,
datetime,
smalldatetime,
time_t,
varbinary,
날짜형 변환
- 이 글의 트랙백 주소
- http://ariswear.com/new_blog/trackback/416
-
하늘사람 @ 2009/11/05 12:51-

- 유익한 정보를 공유해 주셔서 감사합니다. 도움이 많이 되었습니다.
add
- 댓글 남기기


















