MySQL에서 테이블의 열에 INT(정수) 형태로 저장된 유닉스 타임스탬프 값을 TIMESTAMP 형식으로 조회하려면 FROM_UNIXTIME() 함수를 사용하면 됩니다.
FROM_UNIXTIME() 함수란?
FROM_UNIXTIME()은 유닉스 에포크(1970-01-01 00:00:00 UTC) 이후 경과된 초 단위의 정수 값을 MySQL의 DATETIME/TIMESTAMP 형식으로 변환해 주는 내장 함수입니다. 반대로 TIMESTAMP를 정수로 바꾸고 싶을 때는 UNIX_TIMESTAMP() 함수를 사용합니다.
예제 데이터 준비
예를 들어, test123이라는 테이블에 val1이라는 열이 있고, 이 열에 정수 값들이 다음과 같이 저장되어 있다고 가정해 보겠습니다.
mysql> Select * from test123; +------------+ | val1 | +------------+ | 150862 | | 1508622563 | | 622556879 | | 2147483647 | +------------+ 4 rows in set (0.00 sec)
FROM_UNIXTIME()으로 TIMESTAMP 값 조회하기
이제 FROM_UNIXTIME() 함수를 사용하면 정수로 저장된 값들을 사람이 읽기 쉬운 MySQL TIMESTAMP 형식으로 손쉽게 조회할 수 있습니다.
mysql> Select FROM_UNIXTIME(Val1) from test123; +---------------------+ | FROM_UNIXTIME(Val1) | +---------------------+ | 1970-01-02 23:24:22 | | 2017-10-22 03:19:23 | | 1989-09-23 17:57:59 | | 2038-01-19 08:44:07 | +---------------------+ 4 rows in set (0.00 sec)
결과 해석 및 참고 사항
위 결과를 보면 각 정수 값이 날짜와 시간으로 정확히 변환된 것을 확인할 수 있습니다. 몇 가지 알아두면 좋은 점은 다음과 같습니다.
- 2038년 문제: 마지막 값인
2147483647은 부호 있는 32비트 정수가 표현할 수 있는 최대값으로, 이는 2038년 1월 19일에 해당합니다. 이 시점을 넘어서는 타임스탬프는 32비트 정수에 저장할 수 없으므로, 장기적인 서비스라면 BIGINT 타입 사용을 고려하는 것이 좋습니다. - 시간대(Time Zone):
FROM_UNIXTIME()은 MySQL 서버에 설정된 시간대를 기준으로 변환됩니다. 따라서 서버의time_zone설정에 따라 결과가 달라질 수 있습니다. - 형식 지정: 두 번째 인자에 포맷 문자열을 전달하면 원하는 형식으로 출력할 수도 있습니다. 예:
FROM_UNIXTIME(val1, '%Y/%m/%d')
이처럼 FROM_UNIXTIME() 함수 하나만 알고 있으면, INT로 저장된 타임스탬프 데이터를 언제든지 손쉽게 읽기 좋은 날짜·시간 형식으로 변환하여 조회할 수 있습니다.