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", # 버그해결을 위한 코드
)

'DataBase > PostgreSQL' 카테고리의 다른 글
| [유지보수] 백업과 복원 : CLI와 GUI를 사용하여 (0) | 2023.11.14 |
|---|---|
| [Docker] DB서버 및 DB 구축, GUI 연결 (0) | 2023.07.17 |
| [psql] 터미널로 PostgreSQL 사용하기 (0) | 2023.07.10 |
| [객체] 시퀀스 (0) | 2023.05.24 |
| [함수] 시간연산관련, 시리즈 생성 (0) | 2023.05.02 |
댓글