콘텐츠로 이동

Date Time

MySQL은 날짜, 시간 또는 두 정보를 함께 저장할 수 있는 여러 데이터 타입을 제공한다.

데이터 타입저장 공간(Bytes)표현 가능한 값의 범위
YEAR11901 ~ 2155
DATE3’1000-01-01’ ~ ‘9999-12-31’
TIME3 + 소수점 초’-838:59:59’ ~ ‘838:59:59’
DATETIME5 + 소수점 초’1000-01-01 00:00:00’ ~ ‘9999-12-31 23:59:59’
TIMESTAMP4 + 소수점 초’1970-01-01 00:00:01’ UTC ~ ‘2038-01-19 03:14:07’ UTC

각 타입은 필요로 하는 정보의 종류와 범위, 그리고 저장 공간에 따라 선택하여 사용하며, 아래 두 개의 타입은 다음과 같은 특징이 있다.

  • TIME: 시각뿐만 아니라, 두 시점 간의 시간 간격(Elapsed Time)을 저장하는 용도로도 사용될 수 있어 표현 범위가 24시간 초과
  • TIMESTAMP: 1970년 1월 1일 자정(UTC)을 기준으로 초(Second)를 누적하여 시간을 표현(2038년 이슈에 취약점 존재)

소수점 이하 초(Fractional Seconds) 정밀도

섹션 제목: “소수점 이하 초(Fractional Seconds) 정밀도”

TIME, DATETIME, TIMESTAMP 타입은 소수점 이하 초를 지정하여 정밀도를 조절할 수 있다.

  • 소수점 이하 자리수를 0부터 6까지의 숫자로 지정(기본값 = 0)
  • 2자리당 1바이트씩 추가 저장 공간 필요(DATETIME(6) = 5 + 3 바이트)

MySQL에서 날짜와 시간 타입은 타임존 처리에 따라 중요한 차이점을 보인다.

  • DATETIME / DATE: 타임존 정보와 무관하게 동작한다
    • 데이터베이스 커넥션의 time_zone 설정에 영향을 받지 않음
    • 입력된 문자열 값을 그대로 저장하고 조회 시에도 그대로 반환
  • TIMESTAMP: 타임존 정보에 반응한다
    • 값을 저장할 때 현재 세션의 time_zone을 기준으로 UTC(Coordinated Universal Time)로 변환하여 저장
    • 값을 조회할 때는 저장된 UTC 값을 다시 현재 세션의 time_zone에 맞게 변환하여 반환
CREATE TABLE tb_timezone
(
fd_datetime DATETIME,
fd_timestamp TIMESTAMP
);
-- 세션 타임존을 'Asia/Seoul' (UTC+9)로 설정
SET time_zone = 'Asia/Seoul';
INSERT INTO tb_timezone
VALUES (NOW(), NOW());
SELECT *
FROM tb_timezone;
-- fd_datetime과 fd_timestamp가 동일하게 표시된다.
-- +---------------------+---------------------+
-- | fd_datetime | fd_timestamp |
-- +---------------------+---------------------+
-- | 2023-05-05 05:09:00 | 2023-05-05 05:09:00 |
-- +---------------------+---------------------+
-- 세션 타임존을 'America/Los_Angeles' (UTC-7, 서머타임 적용 시)로 변경
SET time_zone = 'America/Los_Angeles';
SELECT *
FROM tb_timezone;
-- fd_datetime은 그대로 유지되지만, fd_timestamp는 LA 시간에 맞게 변환되어 표시된다.
-- +---------------------+---------------------+
-- | fd_datetime | fd_timestamp |
-- +---------------------+---------------------+
-- | 2023-05-05 05:09:00 | 2023-05-04 13:09:00 |
-- +---------------------+---------------------+

DATETIMETIMESTAMP 타입은 행이 생성되거나 변경될 때 자동으로 현재 시각을 기록하도록 설정할 수 있다.

  • DEFAULT CURRENT_TIMESTAMP: 행이 처음 생성될 때의 시각을 자동으로 기록
  • ON UPDATE CURRENT_TIMESTAMP: 해당 행의 다른 컬럼 값이 변경될 때마다 시각을 자동으로 갱신
CREATE TABLE tb_autoupdate
(
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

마지막 업데이트:

MySQL