티스토리 뷰

Server

Mysql Timestamp 과 Datetime의 차이

니용 2021. 11. 12. 10:17
반응형

안녕하세요. 이번 글에서는 흔히들 사용하지만 애매한 정보인 Timestamp와 Datetime의 타입에 대해 비교해보려 합니다.

1. MySQL의 Time Zone

mysql> show variables like '%time_zone%';
+------------------+---------------------+
| Variable_name    |  Value              |
+------------------+---------------------+
| system_time_zone | India Standard Time |
| time_zone        | Asia/Seoul       |
+------------------+---------------------+
2 rows in set (0.00 sec)

2. datetime, timestamp 두 가지 타입을 가진 테이블을 생성합니다.

create table datedemo
(
 mydatetime datetime,
 mytimestamp timestamp
);

Query OK, 0 rows affected (0.05 sec)

3. 현재 시간을 각각의 데이터로 넣어봅니다.

insert into datedemo values ((now()), (now()));

4. 결과는 동일하게 출력됩니다. 

select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2021-11-12 09:11:09 | 2011-11-12 09:11:09 |
+---------------------+---------------------+
1 row in set (0.00 sec)

5. 시스템의 Timezone을 변경해봅니다.

SET TIME_ZONE = "america/new_york";

Query OK, 0 rows affected (0.00 sec)

6. timestamp값이 변경되는 현상이 발견됩니다.

 select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2021-11-12 09:11:09 | 2021-11-11 23:41:09 |
+---------------------+---------------------+
1 row in set (0.00 sec)

왜 이런 현상이 나타날까?

timestamp는 time_zone의 의존한다는 사실

그렇다면 Datetime만 사용하면 되는거 아닌가?

  • 글로벌 서비스를 하면 여러 지역에 DB를 Clustering 해야 합니다.
  • Datetime을 사용하는 경우 time_zone이 반영되지 않기 때문에 아래와 같은 상황에서 문제가 발생합니다.
    • 서울 오전 9시에 작성한 글이 미국으로 Replication하는 경우 여전히 오전 9시로 반영되는 상황이 벌어지게 됩니다.
    • 이런 경우에는 UTC 지원 가능한 timestamp를 사용하는 것이 더 좋아보입니다.

ETC

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까지 지원
  • Index가 더 빠르게 생성된다.

 

추가적으로 Timestamp 타입은 Java 내의 로직에서 LocalDate 또는 LocalDateTime로 변환을 할 때 값을 가져오는 getter가 지원되지 않습니다 ㅠㅡㅠ 

저는 이러한 유틸 클래스를 만들어 사용하고 있습니다.

public LocalDateParseUtil(LocalDate date) {
    this.date = date;
    if (Objects.nonNull(date)) {
        str = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        kor = date.getYear() + "년 " + date.getMonthValue() + "월 " + date.getDayOfMonth() + "일";
    } else {
        str = "";
        kor = "년 월 일";
    }
}

public LocalDateParseUtil(LocalDateTime time) {
    new LocalDateParseUtil(time.toLocalDate());
}

 Table 내 Timestamp 컬럼일 때 를 ts로 가정하고 Date 컬럼일 때 date로 가정하면 결과가 이렇게 출력됩니다.

Timestamp ts = Timestamp.valueOf("2021-11-12T09:11:09");
LocalDateParseUtil tsUtil = new LocalDateParseUtil(ts);
System.out.println(tsUtil.getKor()); // null

LocalDate date = LocalDate.parse("2021-11-12T09:11:09", DateTimeFormatter.ISO_DATE_TIME);
LocalDateParseUtil dateUtil = new LocalDateParseUtil(date);
System.out.println(tdatetil.getKor()); // 2021년 11월 12일

 

사용하실 때 도움이 되시길 바라겠습니다!!

반응형
댓글
공지사항