2019년 6월 11일 화요일

I got to know the problem of Unix time ( x86 server datetime rage - 1970-01-01 00:00:00 ~ 2038-01-19 03:14:08 )


MSSQL에서 POLYBASE로 하둡에 데이터를 떨구려고 하는데 아래와 같은 에러 메시지가 떴다.

메시지 107090, 수준 16, 상태 1, 줄 4
Query aborted-- the maximum reject threshold (0 rows) was reached while reading from an external source: 1 rows rejected out of total 1 rows processed.
Column ordinal: 1, Expected data type: DATETIME2, Offending value: TemporalValue: 347125824000000000 (Column Conversion Error), Error: Error converting from RCFile Type DATETIME2(0) NOT NULL to Sql type Timestamp.



확인해보니 날짜컬럼(DATETIME2)가 문제였고 문제되는 데이터를 찾아보니 1111-11-11 00:00:00 이런식의 데이터가 많았다.

아래는 위키 내용이다.
https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%89%EC%8A%A4_%EC%8B%9C%EA%B0%84

중략...
32비트로 표현된 유닉스 시간은 1970년 1월 1일 00:00 (UTC)에서 2,147,483,647 (231 - 1) 지난 후인 2038년 1월 19일 03:14:08 UTC에 2038년 문제를 발생시킨다. 이는 산술 오버플로와 관련 있는 문제이다.

즉 날짜 가용범위는 1970-01-01 00:00:00 ~ 2038-01-19 03:14:08 인 것이다.

결국 아래처럼 최대, 최소값을 CASE 처리하였다.

CONVERT(DATETIME2(0),CASE WHEN 날짜컬럼 <= '1970-01-01 00:00:00' then '2000-01-01 00:00:00' WHEN 날짜컬럼 >= '2038-01-19 00:00:00' then '2038-01-19 00:00:00' ELSE 날짜컬럼 END)                            


마지막으로 2038년이 가까워질수록 무슨 일이 일어날지 궁금하다.

댓글 없음:

댓글 쓰기

2022년 회고

 올해는 블로그 포스팅을 열심히 못했다. 개인적으로 지금까지 경험했던 내용들을 리마인드하자는 마인드로 한해를 보낸 것 같다.  대부분의 시간을 MLOps pipeline 구축하고 대부분을 최적화 하는데 시간을 많이 할애했다. 결국에는 MLops도 데이...