본문 바로가기
카테고리 없음

SQL Error [1292] [22001]: Data truncation: Truncated incorrect datetime value: '2018-08-25T18:53:48.906490Z'해결 (table 생성시)

by David_Skawns_Lee 2023. 4. 12.

Kaggle 또는 기타 시계열 데이터셋에서 일반적인 Datetime과 달리 2018-08-25T18:53:48.906490Z와 같이 이상하게 생긴 timestamp format시간정보가 존재한다.

평소엔 문제가 안되다가, SQL Error [1292] [22001]: Data truncation: Truncated incorrect datetime value: '2018-08-25T18:53:48.906490Z'에러를 일으키는 경우가 있었다.

 

SELECT 문으로 조회는 잘 됐으면서 해당 결과물을 CREATE Table로 생성할 때, 위와 같은 에러가 발생했다. 해당 에러는 datetime value로의 Truncation(줄이기)작업을 하기에 포맷 자체가 안맞는다는 내용의 에러를 의미한다.

 

우선 위 에러의 해결방법은 아래와 같이 'Z'문자를 삭제해 주는 것이 방법이 될 수 있다.

update [테이블명] set [컬럼명] = replace([컬럼명], 'Z','')

과 같은 명령어를 통해 'Z'를 삭제한 뒤에 Create Table을 진행하면 문제없이 동작한다.

 

더 깊게 들어가보면 해당 데이터에서의 T,Z가 어떤 것을 의미하는지 알 수 있다.

 

TimeStamp Timezone

 

'2018-02-03' 또는 '2018-02-03 18:12:10'과 같이 Datetime 포맷과 달리 timestamp는 알 수 없는 형태를 보인다.
이는 UNIX 시간이라고 하여 1970년 1월 1일 00:00:00 협정 세계시(UTC) 부터의 경과 시간을 초로 환산하여 정수로 표현한 것이다.

 

그냥 보기에 파악하기 어렵기 때문에 이를 ISO, RFC 등 국제 표준 기준에 따라 각기 다르게 환산하여 볼 수 있다.

예시 표

Date Standard
04/12/2023 @ 1:10am UTC
2023-04-12T01:10:36+00:00 ISO 8601
Wed, 12 Apr 2023 01:10:36 +0000 RFC 822, 1036, 1123, 2822
Wednesday, 12-Apr-23 01:10:36 UTC RFC 2822
2023-04-12T01:10:36+00:00 RFC 3339

 

그렇다면, 내 데이터에서의 'Z'는 어떤 것을 의미하는 것인가?


해당 페이지에서 그 정확한 내용을 알 수 있었다.


T는 그저 '날짜'와 '시간'을 구분해주는 구분자 역할을 해주는 것이며, Z는 ISO 8601의 UTC 시간을 의미하는 상징적인 역할을 해준다고 보면 된다. 정확히는 'Zero'라는 의미로 UTC시간의 시작점(1970-01-01 00:00:00)에서부터의 offset(경과 기간) 정도로 이해하면 된다.


다만, 우리가 SQL 사용시 SELECT를 통해 조회를 할 경우, 암묵적 형변환을 통해 시간으로 인지할 수 있지만, CREATE TABLE을 통해 진행할 경우, 이 부분이 형변환이 되지 않아 "Z"를 string으로 인식해 데이터 테이블 형성한 뒤 저장을 하는 작업 과정에 문제가 생긴 것으로 보인다.

 

 

무튼 오늘은 timestamp에서의 convert로 인해 발생한 에러를 해결해보면서 글을 마친다.

댓글