본문 바로가기
DataBase/PostgreSQL

[환경설정] 시간대(time zone) 설정 관련

by 예스p 2023. 9. 11.

time zone

다양한 이유로 원하지 않는 time zone으로 설정될 수 있다.

이를 확인하고 고쳐나가는 방법을 톺아본다.


 

PostgreSQL 시간대설정

  • 프로그램 자체의 타임존을 확인하고 설정한다
  • 확인방법
    - 현재 세션 기준 : SELECT current_setting('timezone');
    - 데이터베이스 클러스터 전체 : SHOW timezone;
  • 임시변경 방법
    - 시간조회시마다 타임존을 지정한다
       >> current_timestamp AT TIME ZONE 'Asia/Seoul'
    - 세션변수를 설정한다(세션 종료시 원래 설정)
       >> SET timezone='Asia/Seoul';
  • 영구변경 방법
    - 설정파일을 열고 timezone항목을 수정한다
       >> C:\Program Files\PostgreSQL\{버전}\data\postgresql.conf
       >> timezone = 'Asia/Seoul'
SELECT current_setting('timezone'); -- 현재 세션 타임존
SHOW timezone; -- 데이터베이스 클러스터 전체 타임존
select current_timestamp; -- 타임존 설정에 따라 현재의 시간을 출력한다.

 

 

칼럼의 시간대 설정

  • 현상
    - DB의 time zone을 설정하더라도 테이블의 칼럼에서 국제표준시가 표기되는 케이스가 있다.
  • 확인방법
    - pg_catalog 스키마의 pg_attribute 테이블을 사용해서 열 데이터의 타입을 확인해준다.
      >> 하단 코드블럭 기술
  • 원인
    - 일반적인 timestamp 타입으로 칼럼을 생성하면 기본값이 'timestamp without time zone'이기 때문
  • 해결방법
    - timestamptz 혹은 timestamp with time zone 타입으로 칼럼을 수정해준다
-- 칼럼들의 타입 조회하기
SELECT attname AS column_name, format_type(atttypid, atttypmod) AS column_type
FROM pg_attribute
WHERE attrelid = '테이블명'::regclass;

 

 

 

버그해결

  • FastAPI와 psycopg2 를 사용해서 조회해오는데, timezone이 UTC로 초기화 되는 버그가 있는 경우, connection에 다음과 같은 options 키를 추가해준다.
    해당 옵션은 PostgreSQL 서버에 연결될때 명령을 실행해준다.(타임존을 다시한번 원하는 곳으로 바꿈)
conn = psycopg2.connect(
    host=os.getenv("DB_HOST"),
    port=os.getenv("DB_PORT"),
    database=os.getenv("DB_NAME"),
    user=os.getenv("DB_USER"),
    password=os.getenv("DB_PASSWORD"),
    options="-c timezone=Asia/Seoul", # 버그해결을 위한 코드
)

 

 

 

 

 

 

 

 

댓글