CodeGym /행동 /SQL SELF /시간과 날짜를 다루는 데이터 타입: DATE, TIME

시간과 날짜를 다루는 데이터 타입: DATE, TIME, TIMESTAMP, TIMESTAMPTZ

SQL SELF
레벨 31 , 레슨 0
사용 가능

데이터 다루다 보면 시간 관련된 게 거의 항상 튀어나오지. 비행기 스케줄, 주문 마감 시간, 아니면 유저가 사이트에 가입한 날짜 같은 거 말이야. 이게 다 시간과 관련된 거고, 제대로 다루려면 딱 맞는 도구가 필요해. PostgreSQL에는 날짜랑 시간을 저장하고 처리하는 데 딱 좋은 전용 데이터 타입들이 있어.

물론 그냥 "2023-10-12" 이런 식으로 문자열로 날짜를 저장할 수도 있긴 한데, 이건 진짜 함정이야. 문자열은 날짜끼리 비교도 못 하고, "3일 더하기" 같은 것도 모름, 심지어 타임존도 전혀 모름. 근데 시간 전용 데이터 타입들은 이런 거 다 알아서 처리해줘. 훨씬 쉽고, 안전하고, 빠르지.

DATE 타입

DATE 타입은 달력 날짜만 저장해. 시간 정보는 없음. 생일이나 연도 시작일처럼 날짜만 필요할 때 딱 좋아.

예시:

-- `DATE` 타입으로 테이블 만들기 예시
CREATE TABLE events (
    event_name TEXT,
    event_date DATE
);

-- 데이터 넣기
INSERT INTO events (event_name, event_date)
VALUES ('PostgreSQL 컨퍼런스', '2023-12-01'),
       ('생일', '2023-10-12');

-- 조회 쿼리
SELECT * FROM events;

결과:

event_name event_date
PostgreSQL 컨퍼런스 2023-12-01
생일 2023-10-12

TIME 타입

TIME 타입은 오직 시간(시, 분, 초)만 저장해. 버스 시간표나 가게 영업시간처럼 시간만 필요할 때 완전 유용함.

예시:

-- `TIME` 타입으로 테이블 만들기 예시
CREATE TABLE schedules (
    schedule_name TEXT,
    start_time TIME,
    end_time TIME
);

-- 데이터 넣기
INSERT INTO schedules (schedule_name, start_time, end_time)
VALUES ('근무 시간', '09:00:00', '18:00:00'),
       ('점심시간', '13:00:00', '14:00:00');

-- 조회 쿼리
SELECT schedule_name, start_time, end_time FROM schedules;

결과:

schedule_name start_time end_time
근무 시간 09:00:00 18:00:00
점심시간 13:00:00 14:00:00

TIMESTAMP 타입

TIMESTAMP 타입은 날짜랑 시간을 한 번에 저장해. 근데 타임존 정보는 없음. 그래서 여러 타임존에서 데이터 쓸 때는 좀 헷갈릴 수 있어.

예시:

-- `TIMESTAMP` 타입으로 테이블 만들기 예시
CREATE TABLE documents (
    document_id SERIAL PRIMARY KEY,
    created_at TIMESTAMP
);

-- 데이터 넣기
INSERT INTO documents (created_at)
VALUES ('2023-10-12 15:30:00'),
       ('2023-12-01 08:45:15');

-- 조회 쿼리
SELECT document_id, created_at FROM documents;

결과:

document_id created_at
1 2023-10-12 15:30:00
2 2023-12-01 08:45:15

TIMESTAMPTZ 타입

TIMESTAMPTZ 타입(TZ는 "타임존"이란 뜻)은 TIMESTAMP랑 비슷한데, 거기에 타임존 정보까지 같이 저장해. 전 세계 유저들이 쓰는 서비스라면 이거 필수임.

예시:

-- `TIMESTAMPTZ` 타입으로 테이블 만들기 예시
CREATE TABLE meetings (
    meeting_id SERIAL PRIMARY KEY,
    meeting_time TIMESTAMPTZ
);

-- 데이터 넣기 (PostgreSQL이 현재 타임존으로 저장함)
INSERT INTO meetings (meeting_time)
VALUES ('2023-10-12 15:30:00+03'),
       ('2023-12-01 08:45:15-05');

-- 조회 쿼리
SELECT meeting_id, meeting_time FROM meetings;

결과:

meeting_id meeting_time
1 2023-10-12 15:30:00+03:00
2 2023-12-01 08:45:15-05:00

참고로 PostgreSQL은 자동으로 서버 타임존에 맞춰서 시간 변환해줘.

전용 데이터 타입을 쓰는 장점

데이터 정확성. DATETIMESTAMP 같은 타입은 잘못된 데이터 입력을 막아줘. 예를 들어 "2023-02-30" 같은 날짜는 아예 저장이 안 됨.

편리함. 날짜끼리 비교하거나, 날짜 빼기, 오늘 날짜 구하기, 값 반올림(이건 나중에 더 다룸) 같은 것도 쉽게 할 수 있어.

성능. 시간 전용 타입은 문자열보다 메모리랑 인덱스 공간도 덜 차지해서 쿼리도 더 빨라져.

예시: 모든 타입을 써서 테이블 만들기

이제 여러 타입을 한 번에 써서 이벤트 스케줄 저장하는 좀 더 복잡한 테이블을 만들어보자. DATE, TIME, TIMESTAMP, TIMESTAMPTZ를 다 써볼 거야.

CREATE TABLE event_schedule (
    event_id SERIAL PRIMARY KEY,
    event_name TEXT NOT NULL,
    event_date DATE NOT NULL,
    start_time TIME NOT NULL,
    end_time TIME NOT NULL,
    full_start TIMESTAMP NOT NULL,
    full_start_with_zone TIMESTAMPTZ NOT NULL
);

-- 데이터 넣기
INSERT INTO event_schedule (
    event_name, event_date, start_time, end_time, full_start, full_start_with_zone
)
VALUES
    ('아침 미탑', '2023-11-10', '10:00:00', '11:30:00', '2023-11-10 10:00:00', '2023-11-10 10:00:00+03'),
    ('저녁 워크샵', '2023-11-11', '18:00:00', '20:00:00', '2023-11-11 18:00:00', '2023-11-11 18:00:00+03');

-- 데이터 확인
SELECT * FROM event_schedule;

결과:

event_id event_name event_date start_time end_time full_start fullstartwith_zone
1 아침 미탑 2023-11-10 10:00:00 11:30:00 2023-11-10 10:00:00 2023-11-10 10:00:00+03:00
2 저녁 워크샵 2023-11-11 18:00:00 20:00:00 2023-11-11 18:00:00 2023-11-11 18:00:00+03:00

이게 바로 실제 스케줄 관리용 데이터베이스 예시야. 각각의 시간 데이터 타입이 상황에 따라 어떻게 서로 보완하는지 볼 수 있지.

이제 DATE, TIME, TIMESTAMP, TIMESTAMPTZ 타입을 PostgreSQL에서 어떻게 쓰는지 감 잡았지? 다음 강의에서는 시간 관련 함수들을 더 깊게 파고들고, SQL 쿼리로 시간 데이터를 추출, 포맷, 관리하는 법도 배워볼 거야.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION