Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 '1965-05-15' 같은 날짜를 TIMESTAMP로 변환하면 0이 반환되는 이유

TIMESTAMP 변환 시 0이 출력되는 원인

MySQL의 UNIX_TIMESTAMP() 함수는 지정된 날짜 또는 날짜·시간 값을 기준 시점(Epoch)으로부터 경과한 초 단위 숫자로 변환해 주는 유용한 도구입니다. 그런데 '1965-05-15'처럼 특정 시점 이전의 날짜를 변환하려고 하면 결과가 항상 0(Zero)으로 반환되는 현상을 볼 수 있습니다.

원인: TIMESTAMP의 유효 범위 제한

그 이유는 MySQL의 TIMESTAMP 데이터 타입이 표현할 수 있는 범위에 제한이 있기 때문입니다. TIMESTAMP의 유효 범위는 다음과 같습니다.

  • 시작: '1970-01-01 00:00:01' UTC
  • 종료: '2038-01-19 08:44:07' UTC

이 범위를 벗어나는 날짜 값은 TIMESTAMP로 변환될 수 없으며, 따라서 UNIX_TIMESTAMP 함수는 항상 0을 반환하게 됩니다. 1965년은 1970년 이전이므로 변환에 실패하고 0이 출력되는 것입니다.

예제로 확인하기

아래 예제를 통해 두 경우의 차이를 직접 확인할 수 있습니다.

mysql> Select UNIX_TIMESTAMP('1965-05-15');
+----------------------------------------------+
| unix_timestamp('1965-05-15 05:04:30')        |
+----------------------------------------------+
|                                            0 |
+----------------------------------------------+
1 row in set (0.00 sec)

mysql> select UNIX_TIMESTAMP('1970-05-15 05:04:30');
+----------------------------------------------+
| unix_timestamp('1970-05-15 05:04:30')        |
+----------------------------------------------+
|                                     11576070 |
+----------------------------------------------+
1 row in set (0.00 sec)

첫 번째 쿼리에서는 1970년 이전인 1965년 날짜를 변환했기 때문에 결과가 0으로 나왔고, 두 번째 쿼리에서는 TIMESTAMP 범위 내에 있는 1970년 5월 15일을 변환하여 정상적으로 초 단위 값(11576070)이 반환되었습니다.

참고 사항

1970년 이전의 과거 날짜나 2038년 이후의 미래 날짜를 다루어야 한다면 TIMESTAMP 대신 DATETIME 타입을 사용하는 것이 좋습니다. DATETIME은 '1000-01-01'부터 '9999-12-31'까지 훨씬 넓은 범위를 지원합니다.