PostgreSQL을 사용할 때 문자열을 timestamp
로 변환해야 하는 경우가 자주 있습니다. 이때 단순히 ::timestamp
로 캐스팅하면 될 것 같지만, 시간대(time zone) 를 고려해야 할 상황에서는 주의가 필요합니다. 이번 글에서는 문자열을 timestamp with time zone
으로 정확하게 변환하는 방법을 정리해보았습니다.
문제 상황: 단순한 캐스팅의 한계
예를 들어 다음과 같이 문자열을 ::timestamp
로 캐스팅하면,
SELECT '2025-07-21 15:00:00'::timestamp;
이 결과는 timestamp without time zone
타입으로 변환됩니다. 즉, 시간대 정보가 없는 순수한 날짜 및 시간 값만 저장됩니다. PostgreSQL에서는 timestamp
와 timestamptz
가 구분되므로, 이 점을 반드시 인지해야 합니다.
해결 방법: 시간대가 포함된 timestamp로 변환하기
문자열을 timestamp with time zone
으로 변환하고자 할 경우에는 다음과 같은 방식으로 캐스팅해야 합니다.
1. 문자열에 시간대 정보가 포함된 경우
SELECT '2025-07-21 15:00:00+09'::timestamptz;
이 방법은 문자열에 포함된 +09
라는 시간대 정보가 그대로 반영되어, 해당 시각이 내부적으로 UTC로 자동 변환됩니다.
2. 문자열에 시간대 정보가 없는 경우
문자열에 시간대가 없다면, 세션에서 설정된 기본 시간대가 적용됩니다. 예를 들어 다음과 같이 설정한 후,
SET TIME ZONE 'Asia/Seoul';
SELECT '2025-07-21 15:00:00'::timestamptz;
Asia/Seoul
기준의 시간으로 해석되어, UTC로 내부 변환됩니다.
3. 명시적인 타입 지정도 가능
::timestamp with time zone
을 사용해도 ::timestamptz
와 동일하게 동작합니다.
SELECT '2025-07-21 15:00:00+09'::timestamp with time zone;
추가 방법: TO_TIMESTAMP()
함수
TO_TIMESTAMP()
함수는 포맷 문자열을 지정해 파싱할 수 있으나, 반환 타입은 timestamp without time zone
입니다. 즉, 시간대 처리를 직접 해줘야 하므로 timestamptz
변환이 필요한 경우에는 적절하지 않을 수 있습니다.
SELECT TO_TIMESTAMP('2025-07-21 15:00:00', 'YYYY-MM-DD HH24:MI:SS');
요약 정리
캐스팅 방식 | 결과 타입 | 시간대 포함 여부 | 비고 |
---|---|---|---|
::timestamp |
timestamp without time zone |
✕ | 시간대 정보 없음 |
::timestamptz |
timestamp with time zone |
⭕ | 시간대 정보 포함됨 |
::timestamp with time zone |
timestamp with time zone |
⭕ | ::timestamptz 와 동일 |
TO_TIMESTAMP() |
timestamp without time zone |
✕ | 포맷 지정 가능, 시간대는 미포함 |
마무리
PostgreSQL에서 시간 정보를 다룰 때는 timestamp
와 timestamptz
의 차이를 정확히 이해하고 사용하는 것이 중요합니다. 특히 시간대가 중요한 시스템에서는 항상 timestamptz
를 사용하는 것이 바람직하며, 캐스팅 시에도 ::timestamp
보다는 ::timestamptz
를 명확하게 사용해야 합니다.
'개발 (Development) > PostgreSQL' 카테고리의 다른 글
[PostgreSQL/TimescaleDB] 데이터 적재 시 발생하는 statement_timeout 및 row is too big 오류 해결 방법 (0) | 2025.08.10 |
---|---|
[PostgreSQL] View와 Materialized View의 차이점과 사용법 (0) | 2025.08.03 |
[PostgreSQL] MyBatis foreach + UNION ALL 쿼리의 성능 문제와 PostgreSQL 최적화 (1) | 2025.07.05 |
[PostgreSQL] PostgreSQL에서 threshold 값 이력 관리 및 최신값 조회 테이블 설계하기 (0) | 2025.06.28 |
[PostgreSQL] 두 테이블 비교 시 기준 테이블의 데이터를 모두 유지하는 방법 (0) | 2025.05.25 |