예를 들어, 네가 항공권 예약 앱을 만든다고 해보자. 비행기가 뉴욕에서 현지 시간 10:00에 출발해서 런던에 현지 시간 22:00에 도착해. 타임존 신경 안 쓰면 서버가 도착 시간을 완전 엉망으로 보여줄 수도 있어.
타임존은 진짜 든든한 친구(아니면, 뭔가 꼬이면 완전 빡치는 적)야. 만약 유저들이 여러 나라에 있거나, 현지 시간에 따라 달라지는 스케줄(예: 비행기 시간표, 이벤트 일정 등)을 다뤄야 한다면, 타임존 처리는 필수야.
시간 데이터 타입 종류
이미 얘기했지만, 시간 관련 데이터 다룰 때 두 가지 타입이 있어:
TIMESTAMP: 날짜랑 시간 타임존 없이 저장.TIMESTAMPTZ: 날짜랑 시간 타임존 포함해서 저장.
예시로 다시 한 번 정리해볼게.
-- TIMESTAMP랑 TIMESTAMPTZ 두 컬럼으로 테이블 만들기
CREATE TABLE flight_schedule (
flight_id SERIAL PRIMARY KEY,
departure_time TIMESTAMP,
departure_time_with_tz TIMESTAMPTZ
);
-- 데이터 넣기
INSERT INTO flight_schedule (departure_time, departure_time_with_tz)
VALUES
('2023-10-25 10:00:00', '2023-10-25 10:00:00+00');
-- 데이터 확인
SELECT * FROM flight_schedule;
결과는 네 서버의 타임존에 따라 달라질 수 있어. 예를 들면:
| flight_id | departure_time | departure_time_with_tz |
|---|---|---|
| 1 | 2023-10-25 10:00:00 | 2023-10-25 10:00:00+00 |
핵심 차이점:
departure_time컬럼은 그냥 날짜랑 시간만 저장하고, 타임존 정보는 없어.departure_time_with_tz컬럼은 날짜, 시간, 그리고 타임존 정보(+00이 예시에서는)를 같이 저장해.
시간을 다른 타임존으로 변환하기
PostgreSQL에서 타임존 변환할 때 AT TIME ZONE 함수 써.
UTC를 로컬 타임으로 변환
예를 들어, UTC(세계 표준시)로 저장된 시간이 있고, 이걸 America/New_York 타임존 유저한테 보여주고 싶다고 해보자.
SELECT
'2023-10-25 14:00:00+00'::TIMESTAMPTZ AT TIME ZONE 'America/New_York' AS local_time;
결과:
| local_time |
|---|
| 2023-10-25 10:00:00 |
AT TIME ZONE은 마법처럼 UTC 시간을 지정한 타임존 시간으로 바꿔줘.
로컬 타임을 UTC로 변환
이번엔 반대로, America/New_York 시간으로 저장된 걸 UTC로 바꿔보자.
SELECT
'2023-10-25 10:00:00'::TIMESTAMP AT TIME ZONE 'America/New_York' AS utc_time;
결과:
| utc_time |
|---|
| 2023-10-25 14:00:00+00 |
결과는 TIMESTAMPTZ 타입으로 나오고, 타임존 정보(여기선 UTC)가 포함돼 있어.
TIMESTAMPTZ 데이터 타입 다루기
TIMESTAMPTZ 쓸 때는 PostgreSQL이 서버 타임존(아니면 네가 지정한 타임존)을 자동으로 적용해줘.
현재 세션에 타임존을 지정하려면 이렇게 하면 돼:
SET TIMEZONE = 'Europe/Istanbul';
이후에 TIMESTAMPTZ 관련 모든 작업은 이 타임존 기준으로 처리돼.
예시: 데이터 넣고 뽑아보기
-- 타임존 설정
SET TIMEZONE = 'Europe/Istanbul';
-- 데이터 넣기
INSERT INTO flight_schedule (departure_time_with_tz)
VALUES ('2023-10-25 10:00:00+00');
-- 데이터 확인
SELECT departure_time_with_tz FROM flight_schedule;
Europe/Istanbul 타임존에서 결과:
| departure_time_with_tz |
|---|
| 2023-10-25 13:00:00+03 |
PostgreSQL이 UTC에서 네가 지정한 타임존으로 자동 변환해줘.
실전 예제
스케줄에 타임존 적용하기. 예를 들어, 비행기 스케줄 테이블이 있고, 출발 시간이 UTC로 저장돼 있다고 해보자. 각 비행기의 출발 시간을 유저의 로컬 타임으로 보여주고 싶을 때 이렇게 하면 돼.
SELECT
flight_id,
departure_time_with_tz AT TIME ZONE 'America/New_York' AS local_time
FROM flight_schedule;
다른 타임존의 시간 비교하기. 예를 들어, 서로 다른 도시에서 일어난 두 이벤트를 비교한다고 해보자. PostgreSQL은 자동으로 같은 타임존으로 맞춰서 비교해줘.
SELECT
'2023-10-25 10:00:00+03'::TIMESTAMPTZ > '2023-10-25 07:00:00+00'::TIMESTAMPTZ AS event_one_later;
결과:
| event_one_later |
|---|
| t |
비교 결과 true가 나왔어. 10:00+03이 07:00+00과 같은 시간이니까.
꿀팁 & 자주 하는 실수
시간 다루는 건 진짜 헷갈릴 수 있어. 이런 실수들 많이 해:
TIMESTAMP만 쓰고TIMESTAMPTZ안 써서, 왜 시간이 안 맞는지 한참 헤매는 경우 — 타임존 정보가 아예 없으니까 그래.- 서버가 어떤 타임존으로 동작하는지 몰라서, 데이터 넣을 땐 한 시간, 뽑을 땐 또 다른 시간으로 나오는 경우.
AT TIME ZONE쓸 때 타임존 이름을 잘못 써서 에러 나거나, 엉뚱한 시간 나오는 경우.
이런 실수 피하려면:
- 거의 항상
TIMESTAMPTZ쓰는 게 좋아. 특히 타임존에 따라 값이 달라질 수 있으면 무조건! - 시간은 UTC로 저장하고, 유저한테 보여줄 때만 원하는 타임존으로 변환해.
- 더 깊게 공부하고 싶으면 PostgreSQL 공식 문서(날짜/시간 & 타임존) 참고해봐. 진짜 도움 많이 돼.
GO TO FULL VERSION