'1970-01-01 00:00:01'
UTC to '2038-01-19 03:14:07'
UTC 였다. MySQL 8.x 버전에서 이를 개선해 8바이트 범위까지 표현 가능하게 개선했다.1970–01–01 00:00:00.000000 ~ 3001–01–18 23:59:59.000000
이다.멘토님께 프로젝트 ERD 피드백을 요청했다. 테이블 컬럼중 데이터 생성일 타입을 timestamp 로 한걸 보시곤 timestamp 와 datetime 을 비교해보라는 피드백을 주셨다.
질문을 받고 MySQL 공식문서를 찾아보니 모든게 다 있었다.
앞으로 공식문서를 참고하는 걸 진짜 습관화해야겠다....
UTC 란?
UTC?
*협정 세계시(協定世界時, 영어: Coordinated Universal Time/Universal Time Coordinated, UTC)는 1972년 1월 1일부터 시행된 국제 표준시이며, 1970년 1월 1일 자정을 0 밀리초로 설정하여 기준을 삼아 그 후로 시간의 흐름을 밀리초로 계산한다. UTC는 국제원자시와 윤초 보정을 기반으로 표준화되었다.*
UTC는 그리니치 평균시(GMT)에 기반하므로 GMT로도 불리기도 하는데, UTC와 GMT는 초의 소숫점 단위에서만 차이가 나기 때문에 일상에서는 혼용된다. 기술적인 표기에서는 UTC가 사용된다.
Data 와 Time 으로 구성된 값
current time zone 을 UTC 기준으로 변환하고 역으로도 변환해준다. datatime 타입엔 이 기능이 없다.
범위 : '1970-01-01 00:00:01'
UTC to '2038-01-19 03:14:07'
UTC.
범위를 보면 2038-01-09 03:14:07 까지만 표현이 가능하다. 그 이유는 timestamp 의 자료 크기는 4바이트인데 이 숫자로 표현 가능한 시간이 2038-01-09 03:14:07 인 것이다.
그럼 2038-01-09 03:14:07 까지만 표현할 수 없는건가 ? 아니다. MySQL 은 8.x 버전에서 이를 개선했다고 한다. 특정 조건을 만족하면 8바이트로 표현 범위가 늘어난다.
그래서 1970–01–01 00:00:00.000000 ~ 3001–01–18 23:59:59.000000
으로 확장되었다고 한다.
current time zone 은 서버 시간을 따른다.
If you store a
TIMESTAMP
value, and then change the time zone and retrieve the value, the retrieved value is different from the value you stored.
This occurs because the same time zone was not used for conversion in both directions. The current time zone is available as the value of the[time_zone](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_time_zone)
system variable.
저장할 시 셋팅된 time zone 과 이 이후에 time zone 셋팅이 변경되면 읽기 시 저정했을 때 값과 다르게 나온다.
입력한 데이터가 유효한 날짜와 시간이 아니면 YYYY-MM-DD hh:mm:ss
[.fraction
] 세 부분 모두 0으로 셋팅된다.
숫자형으로 저장된다. 1970-01-01 00:00:00
을 기준으로 몇초가 지났는지를 저장한다.
4바이트의 저장공간을 사용한다.
null 이 허용되지 않는다. null 을 셋팅하려면 명시적으로 null 을 선언해야한다.
CREATE TABLE t
(
ts1 TIMESTAMP NULL DEFAULT NULL,
ts2 TIMESTAMP NULL DEFAULT 0,
ts3 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
);
'***YYYY-MM-DD hh:mm:ss***'
format'1000-01-01 00:00:00'
to '9999-12-31 23:59:59'
https://medium.com/finda-tech/mysql-timestamp-%EC%99%80-y2k38-problem-d43b8f119ce5