TIMESTAMP
와 DATETIME
의 공통점DATETIME
으로, TIMESTAMP
로DATETIME
: '1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.499999'TIMESTAMP
: '1970-01-01 00:00:01.000000' to '2038-01-19 03:14:07.499999'DATETIME
과는 달리, TIMESTAMP
의 경우 저장할 때 UTC로 변환되어 저장되었다가 읽을 때 현재 타임존으로 변환되어 조회된다.TIMESTAMP
타입 컬럼에 저장한 값이 정말 다르게 보이는지 확인한다.
DATETIME
타입의 컬럼 하나와 TIMESTAMP
타입의 컬럼 하나를 만든다.CREATE TABLE `test` (
`id` int NOT NULL,
`dt` datetime(3) DEFAULT NULL,
`ts` timestamp(3) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
SET @@session.time_zone = '+09:00';
INSERT INTO test (`id`, `dt`, `ts`)
VALUES (1, '2023-07-12 01:29:00', '2023-07-12 01:29:00');
SELECT * FROM test;
| 1 | 2023-07-12 01:29:00 | 2023-07-12 01:29:00 |
SET @@session.time_zone = '+00:00';
SELECT * FROM test;
| 1 | 2023-07-12 01:29:00 | 2023-07-11 16:29:00 |
DATETIME
타입 컬럼에 저장했던 값은 그대로이지만, TIMESTAMP
타입 컬럼에 저장했던 값이 타임존에 따라 다르게 보이는 것을 확인할 수 있다.모델의 필드 타입이 DateTime
이면 기본적으로 MySQL의 DATETIME
으로 만들어짐.
모델의 필드에 추가로 @db.Timestamp(x)
을 붙이면 TIMESTAMP(x)
으로 매핑됨.
공식문서 - DateTime
Java LocalDateTime
이면 DDL 생성 시 MySQL의 DATETIME
으로 만들어짐.
(얘는 TIMESTAMP일 것 같았는데 아니었어)
애플리케이션이 돌고 있는 PC 타임존: Asia/Seoul (GMT+9)
애플리케이션에서 DB 연결 시 타임존: UTC
(예: spring.datasource.url=jdbc:mysql://127.0.0.1:53306/test?serverTimezone=UTC
)
저장하는 값: 2023-07-12 13:00:00
(GMT+9
)
DB 타임존: Asia/Seoul
저장 결과 (DB에서 조회 시)
DATETIME
: 2023-07-12 04:00:00
❓ 한국 시간이 아닌데
GMT-7
이면 7시간 더하고 저장됨)2023-07-12 13:00:00
) 그대로 잘 조회됨.⭕️UTC
가 아니라 Asia/Seoul
인데 그렇게 생각하는 게 맞을까?TIMESTAMP
(UTC): 2023-07-11 19:00:00
❓ 뭐지 이 뜬금없는 값은
TIMESTAMP
(GMT+9): 2023-07-12 04:00:00
❓
Asia/Seoul
이기 때문에 2023-07-12 04:00:00
을 GMT+9 간주. DB에서 UTC로 조회하면 다시 9시간을 빼서 2023-07-11 19:00:00
가 조회됨.2023-07-12 13:00:00
) 그대로 잘 조회됨.⭕️