MySQL의 UNIX_TIMESTAMP() 함수에 인수로 전달할 수 있는 날짜·시간 값의 범위는 TIMESTAMP 데이터 타입의 유효 범위와 동일합니다. 즉, '1970-01-01 00:00:01'부터 '2038-01-19 08:44:07'까지입니다.
만약 이 범위를 벗어나는(그 이후 또는 그 이전) 날짜·시간 값을 UNIX_TIMESTAMP 함수에 전달하면, MySQL은 오류 대신 0을 반환합니다. 이는 유닉스 타임스탬프가 내부적으로 부호 있는 32비트 정수(signed integer)로 처리되기 때문이며, 그 최댓값인 2147483647이 정확히 '2038-01-19 08:44:07'에 해당합니다. 흔히 말하는 2038년 문제(Y2038 Problem)가 바로 이 한계에서 비롯된 것입니다.
범위 경계값 확인 예제
다음 예제를 통해 실제 동작을 확인해 보겠습니다.
mysql> select UNIX_TIMESTAMP('2038-01-19 08:44:07');
+---------------------------------------+
| UNIX_TIMESTAMP('2038-01-19 08:44:07') |
+---------------------------------------+
| 2147483647 |
+---------------------------------------+
1 row in set (0.00 sec)
mysql> select UNIX_TIMESTAMP('2038-01-19 08:44:08');
+---------------------------------------+
| UNIX_TIMESTAMP('2038-01-19 08:44:08') |
+---------------------------------------+
| 0 |
+---------------------------------------+
1 row in set (0.00 sec)
mysql> select UNIX_TIMESTAMP('1969-01-01 05:10:00');
+---------------------------------------+
| UNIX_TIMESTAMP('1969-01-01 05:10:00') |
+---------------------------------------+
| 0 |
+---------------------------------------+
1 row in set (0.00 sec)실행 결과를 살펴보면 다음과 같습니다.
- 첫 번째 쿼리는 TIMESTAMP 범위의 최대 경계값('2038-01-19 08:44:07')을 조회하여 최댓값인 2147483647을 반환합니다.
- 두 번째 쿼리는 그보다 1초 늦은 값을 조회했기 때문에 범위를 벗어나 0을 반환합니다.
- 세 번째 쿼리는 1970년 이전인 1969년의 값을 조회했으므로 역시 0을 반환합니다.
실무 활용 팁
따라서 UNIX_TIMESTAMP 함수를 사용할 때는 입력하려는 날짜가 위 범위 안에 있는지 반드시 확인해야 합니다. 특히 과거의 이력 데이터나 장기적인 미래 일정을 다루는 경우, 범위 밖의 값이 조용히 0으로 변환되어 데이터 무결성 문제가 발생할 수 있으므로 주의가 필요합니다. 더 넓은 범위의 날짜를 다루어야 한다면 DATETIME 타입을 함께 고려하는 것이 좋습니다.