데이터 다루다 보면 시간 관련된 게 거의 항상 튀어나오지. 비행기 스케줄, 주문 마감 시간, 아니면 유저가 사이트에 가입한 날짜 같은 거 말이야. 이게 다 시간과 관련된 거고, 제대로 다루려면 딱 맞는 도구가 필요해. 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은 자동으로 서버 타임존에 맞춰서 시간 변환해줘.
전용 데이터 타입을 쓰는 장점
데이터 정확성. DATE나 TIMESTAMP 같은 타입은 잘못된 데이터 입력을 막아줘. 예를 들어 "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 쿼리로 시간 데이터를 추출, 포맷, 관리하는 법도 배워볼 거야.
GO TO FULL VERSION