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

[MySQL] DATETIME vs TIMESTAMP

by 연로그 2022. 9. 25.
반응형

🙄 서론 🙄

JPA를 쓰다보면 엔티티 정보에 따라 자동으로 생성해주는 DDL을 볼 수 있다. LocalDateTime 타입을 포함한 엔티티가 있었는데 해당 필드를 timestamp로 만들어주는 모습을 볼 수 있었다. datetime이라는 타입도 있는걸로 아는데 왜 timestamp로 만들어줄까? 라는 궁금증이 생겨 찾아보게 되었다.

 

 

💥 DATETIME vs TIMESTAMP 💥

 

🔸 공통점

  • MySQL에서 날짜를 나타내는 필드
  • 기본적으로 'YYYY-MM-DD hh:mm:ss'으로 표시
  • 값을 설정하여 최대 6자리 microseconds 저장 가능
    (ex: DATETIME(6), TIMESTAMP(6))

 

🔸 차이점

DATETIME은 '1000-01-01 00:00:00'에서 '9999-12-31 23:59:59'까지 표시 가능하다. TIMESTAMP는 이와는 다르게 '1970-01-01 00:00:01'에서 '2038-01-19 03:14:07'까지 표시 가능한데 이 이유는 UTC 때문이다. UTC는 협정 세계시로 1970년 1월 1일 자정을 0밀리초로 설정해 기준삼아 이후의 시간 흐름을 밀리초로 계산한다. TIMESTAMP는 이 UTC에 맞춰 시간을 보여준다.

 

 TIMESTAMP는 time_zone에 의존한다. 서비스가 한 지역에서만 진행된다면 괜찮지만 여러 지역에서 사용하는 등 UTC를 고려해야 하는 서비스라면 TIMESTAMP를 이용해야 한다. 예제를 통해 무엇이 다른지 살펴보자.

 

🔸 테스트 예제

날짜 정보를 저장할 테이블을 생성하고 now()를 통해 현재 시간을 저장해보자.

mysql> create table testdate(datetime1 datetime, timestamp1 timestamp);
Query OK, 0 rows affected (0.09 sec)

mysql> insert into testdate values(now(), now());
Query OK, 1 row affected (0.02 sec)

mysql> select * from testdate;
+---------------------+---------------------+
| datetime1           | timestamp1          |
+---------------------+---------------------+
| 2022-09-25 17:55:09 | 2022-09-25 17:55:09 |
+---------------------+---------------------+
1 row in set (0.00 sec)

 

타임존을 바꿔서 데이터를 다시 확인해보자.

datetime은 고정인데 timestamp의 값은 변경된 것을 확인할 수 있다.

변경된 타임존에 맞춰 데이터를 바꿔서 보여주기 때문이다.

mysql> set time_zone="america/new_york";
Query OK, 0 rows affected (0.01 sec)

mysql> select * from testdate;
+---------------------+---------------------+
| datetime1           | timestamp1          |
+---------------------+---------------------+
| 2022-09-25 17:55:09 | 2022-09-25 04:55:09 |
+---------------------+---------------------+
1 row in set (0.00 sec)

 


참고

반응형