CodeGym /행동 /SQL SELF /타임존 다루기: TIMEZONE

타임존 다루기: TIMEZONE

SQL SELF
레벨 32 , 레슨 2
사용 가능

예를 들어, 네가 항공권 예약 앱을 만든다고 해보자. 비행기가 뉴욕에서 현지 시간 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+0307:00+00과 같은 시간이니까.

꿀팁 & 자주 하는 실수

시간 다루는 건 진짜 헷갈릴 수 있어. 이런 실수들 많이 해:

  • TIMESTAMP만 쓰고 TIMESTAMPTZ 안 써서, 왜 시간이 안 맞는지 한참 헤매는 경우 — 타임존 정보가 아예 없으니까 그래.
  • 서버가 어떤 타임존으로 동작하는지 몰라서, 데이터 넣을 땐 한 시간, 뽑을 땐 또 다른 시간으로 나오는 경우.
  • AT TIME ZONE 쓸 때 타임존 이름을 잘못 써서 에러 나거나, 엉뚱한 시간 나오는 경우.

이런 실수 피하려면:

  • 거의 항상 TIMESTAMPTZ 쓰는 게 좋아. 특히 타임존에 따라 값이 달라질 수 있으면 무조건!
  • 시간은 UTC로 저장하고, 유저한테 보여줄 때만 원하는 타임존으로 변환해.
  • 더 깊게 공부하고 싶으면 PostgreSQL 공식 문서(날짜/시간 & 타임존) 참고해봐. 진짜 도움 많이 돼.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION