MySQL, DATETIME VS TIMESTAMP

2022. 5. 5. 21:50BACKEND/Database

MySQL의 날짜 표기 법인 DATE, DATETIME, TIMESTAMP 타입을 이해하고 구분하는 것이 해당 포스팅의 목표입니다.

 


Date Types

 

MySQL에서는 날짜를 표기할 때 DATE, DATETIME, TIMESTAMP 타입을 사용할 수 있습니다.

이 타입들은 어떤 차이가 있을지 알아보도록 합시다.

 

  DATE DATETIME TIMESTAMP
Format YYYY-MM-DD YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss
Desc - 날짜만 표기 - 날짜 및 시간 표기 - 날짜 및 시간 표기
- 기본적으로 NOT NULL
- Timezone 기반
Supported 1000-01-01 ~ 9999-12-31 1000-01-01 00:00:00
~ 9999-12-31 23:59:59
1970-01-01 00:00:01 UTC
~ 2038-01-1903:14:07 UTC
Storage 3 bytes 8 Byte 4 Byte

 

DATE와 DATETIME의 경우, supported 값은 해당 값 이외의 시간이 작동할 수도 있지만, 그에 대한 보장을 하지 않습니다.

 

 

표를 보면 DATETIME과 TIMESTAMP의 표기까지는 비슷한데, 어떤 차이가 있는지 확인하기 어렵습니다.

실제로 많은 분들이 이 둘의 차이를 모르고 선행적으로 사용하던 차입을 고수하는 경향이 있는 것을 볼 수 있는데요.

두 차이를 확인하고 적절한 타입을 사용하는 것을 목표로, 해당 포스팅을 살펴보도록 합시다.

 

 

 

 

DATETIME vs TIMESTAMP

 

DATETIME과 TIMESTAMP의 차이는 Timezone이 적용되는지의 여부입니다.

TIMESTAMP는 내부적으로 시간을 가져올 때 Timezone을 적용해서 보여줍니다.

 

그렇다면, Timezone이 어떤 것인지 알아보고

실제로 테스트를 해보며 확실한 이해를 가져보도록 하겠습니다.

 

 

 

Timezone

타임존은 동일한 로컬 시간을 따르는 지역을 의미하며, 해당 국가에 의해 법적으로 지정됩니다. 

 

시간대는 지구의 자전에 따른, 지역 사이에 생기는 낮과 밤의 차이를 인위적으로 조정하기 위해 고안된 시간의 구분선을 말하는데요. 이는 영국의 그리니치 천문대를 기준으로 지역에 따른 시간의 차이를 계산하여 적용합니다.

 

UTC, KST 등의 표기법을 많이 보셨을 텐데, 이 표기법이 바로 해당 시간이 어느 로컬 기준으로 작성했는지를 명시하기 위함입니다.

 

만약, 08:00AM 이라는 시간 표기가 있을 때, 로컬 타임 표기가 없다면 어떨까요?

영국과 한국에서 08:00AM 이라는 시간에 화상 회의를 한다고 발표하면 큰 혼란이 오겠죠.

 

자세한 내용은 "TimeZone, 어렵지 않게 이해하기"를 참고하시길 바랍니다.

 

 

 

 

Demo TEST

 

테스트 과정을 요약하자면,

DATETIME과 TIMEZONE 필드를 생성한 후 같은 날짜 데이터(now())를 삽입합니다.

그 후 Timezone을 변경한 후에 어떻게 다른 결과를 보여주는 지 실제로 확인해보겠습니다.

 

📌 Test Table

테스트를 위한 테이블을 설정합니다.

아래와 같은 쿼리문으로 테이블을 생성합니다.

 

CREATE TABLE date_test ( 
  datetime DATETIME,
  timestamp TIMESTAMP
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4;

 

생선된 테이블을 확인하면 아래와 같습니다.

 

mysql> DESC date_test;
+-----------+-----------+------+-----+---------+-------+
| Field     | Type      | Null | Key | Default | Extra |
+-----------+-----------+------+-----+---------+-------+
| datetime  | datetime  | YES  |     | NULL    |       |
| timestamp | timestamp | YES  |     | NULL    |       |
+-----------+-----------+------+-----+---------+-------+

 

 

📌  Insert Test Data

동일한 날짜 데이터를 입력합니다.

 

mysql> INSERT INTO date_test VALUES (now(), now());
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM date_test;
+---------------------+---------------------+
| datetime            | timestamp           |
+---------------------+---------------------+
| 2022-05-05 21:17:04 | 2022-05-05 21:17:04 |
+---------------------+---------------------+
1 row in set (0.00 sec)

 

동일한 시간이 삽입된 것을 확인할 수 있습니다.

 

 

📌  Timezone Check

Timestamp는 Timezone을 기반으로 보여준다고 했는데요.

Timezone 설정을 확인해보고, 수정해보도록 하겠습니다.

 

아래는 mysql 공식 문서에서 명시하고 있는 time_zone 변수 스펙입니다.

 

 

mysql 공식문서에서 확인할 수 있는 time_zone 변수는

Global, Session Scope을 가지고 있으며, Default ValueSYSTEM인 것을 확인할 수 있습니다.

그렇다면 이 값을 확인해보도록 할게요.

 

mysql> SELECT @@GLOBAL.time_zone, @@SESSION.time_zone, @@system_time_zone;
+--------------------+---------------------+--------------------+
| @@GLOBAL.time_zone | @@SESSION.time_zone | @@system_time_zone |
+--------------------+---------------------+--------------------+
| SYSTEM             | SYSTEM              | KST                |
+--------------------+---------------------+--------------------+
1 row in set (0.00 sec)

 

순서대로 Global timezone, Session timezone, 그리고 Default Value인 system_time_zone 입니다.

결과적으로 필자가 사용하는 mysql 은Timezone으로 KST를 사용하고 있는 것을 확인할 수 있습니다.

 

그럼 이번엔 Timezone을 변경해보도록 하겠습니다.

 

 

 

📌  Change Timezone

 

Timezone을 변경하는 방법은 아래와 같습니다.

 

SET time_zone = '+01:00';

 

변경된 Timezone을 확인해봅시다.

 

mysql> SELECT @@GLOBAL.time_zone, @@SESSION.time_zone, @@system_time_zone;
+--------------------+---------------------+--------------------+
| @@GLOBAL.time_zone | @@SESSION.time_zone | @@system_time_zone |
+--------------------+---------------------+--------------------+
| SYSTEM             | +01:00              | KST                |
+--------------------+---------------------+--------------------+
1 row in set (0.00 sec)

 

현재 세션의 Timezone을 +01:00으로 변경했습니다.

이는 이전의 KST(UTC+09:00)보다 8시간 이전으로 설정한 것입니다.

 

이제 다시 데이터 확인을 해볼까요?

 

 

📌  Conclusion

위에서 생성한 데이터를 그대로 확인해보면 아래와 같이 달라진 것을 확인할 수 있습니다.

 

mysql> SELECT * FROM date_test;
+---------------------+---------------------+
| datetime            | timestamp           |
+---------------------+---------------------+
| 2022-05-05 21:17:04 | 2022-05-05 13:17:04 |
+---------------------+---------------------+

 

실제로 21시에서 8시간 앞선 13시로 표기됨을 확인할 수 있습니다.

 

 


 

 

글로벌 서비스를 할 때, 이 시간을 관리할 필요가 생길 수 있는데요.

이런 면에서 간단하지만 반드시 확인하고 갈 개념인 것 같습니다.

 

 

그럼 지금까지 MySQL의 DATETIME과 TIMESTAMP를 비교해보았습니다.

오타나 잘못된 내용을 댓글로 남겨주세요!

감사합니다 ☺️