Database/Mysql

[Real MySQL] 15-3. 데이터 타입: 날짜와 시간

noahkim_ 2023. 11. 26. 15:55

백은빈, 이성욱 님의 "Real MySQL" 책을 정리한 포스팅 입니다.

 

1. 날짜와 시간

  설명 크기
YEAR 날짜(YYYY) 1 byte
DATE 날짜(YYYY-MM-DD) 3 byte
TIME 시간(HH:MM:SS.MS) 3 ~ 5 byte
TIMESTAMP 날짜 + 시간 (UTC 기준) 4 ~ 7 byte
DATETIME 날짜 + 시간 (로컬 시간 기준) 5 ~ 8 byte
  • 날짜, 시간만 저장하거나 날짜와 시간 같이 저장할 수 있습니다.

 

2. 밀리초 저장

괄호

  • 괄호안의 숫자는 밀리초 자리 수를 의미함
  • 최대 6자리까지 표현할 수 있습니다.
  • 2자리당 1바이트씩 공간이 필요합니다.

 

ex
  • DATETIME(6)

 

3. 타임존

날짜 타입

  • 타임존 정보가 포함되지 않음
  • 클라이언트로부터 입력된 값을 그대로 저장하고 조회합니다.

 

시간 타입

TIMESTAMP
  • 설정된 타임존 기준으로 저장 및 조회를 할 수 있습니다.
  • 기본 타임존: UTC

 

DATETIME
  • 타임존 변환처리가 되지 않습니다. (입력 값 그대로 저장됨)

 

JDBC Driver

  • 날짜/시간 타입을 가져올 때, 클라이언트 타임존으로 자동 변환 발생

 

ResultSet rs = statement.executeQuery("SELECT ts, dt FROM example");
Timestamp ts = rs.getTimestamp("ts"); // 타임존 변환됨 (UTC → 로컬)
Timestamp dt = rs.getTimestamp("dt"); // 변환 없이 그대로
  • ResultSet 클래스에서 DATETIME 컬럼의 값을 가져오는 함수가 getTimestamp()이기 때문

 

시스템 변수

time_zone
  • 클라이언트 타임존
  • 값이 SYSTEM일 경우 system_time_zone 값을 사용한다.

 

system_time_zone
  • 서버 타임존
  • time_zone의 디폴트 값 역할
  • 운영체제의 타임존을 그대로 상속받는다.

 

3. 자동 업데이트

CREATE TABLE logs (
    id INT PRIMARY KEY AUTO_INCREMENT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,  
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

 

DEFAULT
  • insert될 때의 시점을 자동으로 업데이트

 

ON UPDATE
  • update될 때의 시점을 자동으로 업데이트