[PostgreSQL] 문자열을 timestamp with time zone으로 변환하는 방법

2025. 7. 27. 23:56·개발 (Development)/PostgreSQL

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
'개발 (Development)/PostgreSQL' 카테고리의 다른 글
  • [PostgreSQL/TimescaleDB] 데이터 적재 시 발생하는 statement_timeout 및 row is too big 오류 해결 방법
  • [PostgreSQL] View와 Materialized View의 차이점과 사용법
  • [PostgreSQL] MyBatis foreach + UNION ALL 쿼리의 성능 문제와 PostgreSQL 최적화
  • [PostgreSQL] PostgreSQL에서 threshold 값 이력 관리 및 최신값 조회 테이블 설계하기
LoopThinker
LoopThinker
모르는 것을 알아가고, 아는 것을 더 깊게 파고드는 공간
  • LoopThinker
    CodeMemoir
    LoopThinker
  • 전체
    오늘
    어제
    • 분류 전체보기 (216)
      • 개발 (Development) (151)
        • Algorithm (1)
        • Angular (1)
        • AWS (4)
        • DeepSeek (2)
        • Docker (7)
        • Git (3)
        • Java (30)
        • JavaScript (4)
        • Kafka (5)
        • Kubernetes (4)
        • Linux (6)
        • PostgreSQL (37)
        • Python (26)
        • React (3)
        • TypeScript (3)
        • Vue.js (5)
        • General (10)
      • 데이터 분석 (Data Analysis) (1)
      • 알고리즘 문제 풀이 (Problem Solving.. (27)
      • 자격증 (Certifications) (24)
        • ADsP (14)
        • 정보처리기사 (4)
        • Linux Master (5)
        • SQLD (1)
      • 기술 동향 (Tech Trends) (10)
      • 기타 (Others) (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    데이터분석
    docker
    PostgreSQL
    java
    pandas
    Vue.js
    deepseek
    timescaledb
    springboot
    리눅스 마스터 2급 2차
    DevOps
    Kafka
    백준자바
    Linux
    javascript
    백준온라인저지
    리눅스 마스터 2급
    AWS
    Linux master
    자바
    typescript
    백준알고리즘
    오답노트
    ADsP
    MyBatis
    백준
    JPA
    JSON
    python
    Kubernetes
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
LoopThinker
[PostgreSQL] 문자열을 timestamp with time zone으로 변환하는 방법
상단으로

티스토리툴바