DATETIME vs TIMESTAMP

Songss·2024년 11월 29일

DBMS

목록 보기
3/20

DATETIME vs TIMESTAMP

MariaDB에서 DATETIMETIMESTAMP는 모두 날짜와 시간을 저장하기 위해 사용되지만, 주요 차이는 시간대(Timezone) 처리 방식과 동작 특성에 있습니다.


1. DATETIME

  • 시간대(Timezone)와 무관:
    • 저장된 값은 입력된 그대로 저장되며, 서버의 시간대나 클라이언트의 시간대에 영향을 받지 않습니다.
    • 시간대를 따로 고려하지 않고 단순히 날짜와 시간을 저장할 때 적합합니다.
  • 범위:
    • 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 (매우 넓음).
  • 용도:
    • 이벤트 발생 시간, 특정 일정을 저장할 때 적합 (예: 예약 시스템).
    • 시간을 비교하거나 저장 그대로 표시할 경우 유용.
  • 기본값 설정:
    • *DEFAULT CURRENT_TIMESTAMP를 사용할 수 없습니다. 기본값을 명시적으로 설정해야 합니다.*

2. TIMESTAMP

  • 시간대(Timezone)를 반영:
    • 저장된 값은 UTC 기준으로 변환되어 저장되며, 조회 시 서버나 클라이언트의 시간대에 따라 자동 변환됩니다.
    • 글로벌 시간 처리가 필요한 데이터에 적합합니다 (예: 로그 기록, 전 세계 사용자의 데이터 동기화).
  • 범위:
    • 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC (유닉스 시간 제한).
  • 용도:
    • 이벤트 로그, 마지막 수정 시간 등을 저장할 때 적합.
    • 시간대 간 변환이 필요한 데이터를 처리할 때 유용.
  • 기본값 설정:
    • *DEFAULT CURRENT_TIMESTAMP를 사용하여 기본값으로 현재 시간을 설정할 수 있습니다.*
    • 업데이트 시 자동으로 갱신하는 옵션도 가능 (ON UPDATE CURRENT_TIMESTAMP).

3. DATETIME과 TIMESTAMP의 차이점 요약

구분DATETIMETIMESTAMP
시간대 반영시간대 무관시간대 반영 (UTC로 저장, 자동 변환)
범위1000-01-01 ~ 9999-12-311970-01-01 ~ 2038-01-19
저장 형식입력된 그대로 저장UTC 기준으로 저장
기본값 지원기본값 설정 가능 (DEFAULT)DEFAULT CURRENT_TIMESTAMP 지원
사용 사례예약 시스템, 단순 시간 기록로그 기록, 글로벌 시간 관리

4. 사용 예시

DATETIME 예시:

CREATE TABLE events (
    event_id INT AUTO_INCREMENT PRIMARY KEY,
    event_name VARCHAR(50),
    event_datetime DATETIME NOT NULL -- 입력된 시간 그대로 저장
);

INSERT INTO events (event_name, event_datetime)
VALUES ('Meeting', '2024-11-29 15:30:00');

TIMESTAMP 예시:

CREATE TABLE logs (
    log_id INT AUTO_INCREMENT PRIMARY KEY,
    log_message VARCHAR(255),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- UTC 변환 저장
);

INSERT INTO logs (log_message)
VALUES ('User logged in'); -- 현재 시간이 자동 저장

create_at 컬럼은 : TIMESTAMP DEFAULT now() 속성입니다.
update_at 컬럼은 : DATETIME DEFAULT now() ON UPDATE now() 속성입니다.

Alter table

ALTER TABLE posts ADD COLUMN *update_at datetime DEFAULT now() ON UPDATE now();

구문 해석

  1. ALTER TABLE posts
    • posts 테이블을 수정하겠다는 명령입니다.
  2. ADD COLUMN update_at
    • 새로운 열(update_at)을 테이블에 추가합니다.
  3. DATETIME
    • 새로 추가되는 update_at 열의 데이터 타입은 DATETIME입니다. 이 열은 날짜와 시간을 저장합니다.
  4. DEFAULT NOW()
    • 열의 기본값을 현재 날짜와 시간으로 설정합니다.
    • 즉, 레코드가 삽입될 때 해당 열에 값이 지정되지 않으면 자동으로 현재 시간(NOW())이 저장됩니다.
  5. ON UPDATE NOW()
    • 테이블의 레코드가 수정될 때, update_at 열이 자동으로 현재 시간으로 업데이트됩니다.
    • 이 동작은 ON UPDATE 키워드에 의해 트리거됩니다.

즉,
create_at은 레코드가 생성될 때 시간을 적습니다.
update_at은 레코드가 생성될 때 + 레코드 업데이트(ON UPDATE)될 때 시간을 갱신합니다.

결론:

  • 시간대가 중요하지 않은 데이터DATETIME 사용.
  • 시간대 변환 및 동기화가 필요한 데이터TIMESTAMP 사용.

상황에 따라 적합한 데이터 타입을 선택하면 됩니다! 😊

0개의 댓글