Postgres 9.3에서 현재 시간대 이름을 얻으려면 어떻게해야합니까?


85

현재 시간대 이름을 얻고 싶습니다. 내가 이미 달성 한 것은 다음을 utc_offset통해 / 시간대 약어를 얻는 것입니다 .

SELECT * FROM pg_timezone_names WHERE abbrev = current_setting('TIMEZONE')

이것은 나에게이 시간대에 대한 모든 대륙 / 수도 조합을 제공하지만 정확한 것은 아닙니다 timezone. 예를 들면 다음과 같습니다.

Europe/Amsterdam
Europe/Berlin

서버가 있고 서버 Berlin의 시간대 이름을 얻고 싶습니다.

내가 가진 문제 CET는 항상 그렇고 설명 UTC+01:00하지 않습니다 DST iirc.


베를린과 암스테르담의 적절한 시간대 이름은 중앙 유럽 표준시 (CET)입니다. 일반적으로 시간대 이름과 약어는 잘 정의되어 있지 않습니다. ISO 표준이 있지만 많은 국가에서 자체 정의를 사용합니다. PostgreSQL 지원도 완전하지 않습니다 . 자세한 내용 은 postgresql.org/docs/9.4/static/datetime-config-files.html 을 참조 하십시오.
Patrick

1
pg_timezone_names 테이블에서 CET는 약어로 정의되며 예를 들어 "Europe / Berlin"은 이름으로 정의됩니다. 약어가 아닌 이름이 필요합니다.
Deutro

이전 댓글에서 제공 한 링크는 필요한 파일을 제공하기 위해 파일을 편집하는 방법을 보여줍니다. 그것은 얻는 것만 큼 좋습니다.
Patrick

그래서 postgres가 내가 "Europe / Berlin"또는 "Europe / Amsterdam"에 있는지 그냥 내가 시간대 CET에 있다고 말할 방법이 없습니까?
Deutro

질문을 편집하고 "I am in"을 정의 할 수 있습니까? 서버는 (보통) 고정 된 위치에 있으며 시간대는 운영 체제 또는 구성 파일에서 가져옵니다. tz 이름은 서버만큼 고정되어 있습니다. 그렇다면 실제로 서버의 시간대 이름이나 데이터베이스의 데이터를 원하십니까?
Patrick

답변:


121

가장 일반적인 경우 PostgreSQL만으로는 이것이 가능하지 않다고 생각합니다. PostgreSQL을 설치할 때 시간대를 선택합니다. 기본값은 운영 체제의 시간대를 사용하는 것입니다. 일반적으로 postgresql.conf에 "timezone"매개 변수 값으로 반영됩니다. 그러나 값은 "localtime"으로 끝납니다. SQL 문에서이 설정을 볼 수 있습니다.

show timezone;

그러나 postgresql.conf의 시간대를 "Europe / Berlin"과 같은 것으로 변경하면 다음 show timezone;을 반환 합니다. "localtime"대신 값 .

따라서 귀하의 솔루션은 postgresql.conf의 "timezone"을 기본 "localtime"이 아닌 명시적인 값으로 설정하는 것을 포함 할 것이라고 생각합니다.


답변 해 주셔서 감사합니다. 시스템 시간대를 가져올 수 없다는 것이 이상합니다.
Deutro 2015 년

3
시간대를 설정하려면 set timezone to 'UTC'.
ivkremer

@ivkremer : set timezone하나의 클라이언트 세션에 대한 시간대를 설정합니다. PostgreSQL 서버의 시간대를 설정하지 않습니다.
Mike Sherrill 'Cat

@ MikeSherrill'CatRecall '감사합니다. 확인하지 않았습니다.
ivkremer

25

이것은 문제를 해결하는 데 도움이 될 수도 있고 그렇지 않을 수도 있지만 UTC ( UT1 , 기술적으로)에 상대적인 현재 서버의 시간대를 얻으려면 다음을 수행하십시오.

SELECT EXTRACT(TIMEZONE FROM now())/3600.0;

위의 방법은 UT1 상대 오프셋을 분 단위로 추출한 다음 3600 초 / 시간의 계수를 사용하여 시간으로 변환하는 방식으로 작동합니다.

예:

SET SESSION timezone TO 'Asia/Kabul';
SELECT EXTRACT(TIMEZONE FROM now())/3600.0;
-- output: 4.5 (as of the writing of this post)

( 문서 ).


6
다른 사용자 가를 사용 하도록 제안SELECT EXTRACT(TIMEZONE_HOUR FROM now()) 했지만 절반 및 1/4 시간대모두 있다는 사실을 무시 하기 때문에 약간 위험 합니다 . @giladMayani
koyae

2
"북한, 뉴 펀들 랜드, 인도,이란, 아프가니스탄, 베네수엘라, 버마, 스리랑카, 마르케 사스 및 호주 일부 지역은 표준 시간에서 30 분 차이를 사용합니다. 네팔과 같은 일부 국가 및 다음과 같은 일부 지방은 채텀 제도에서는 1/4 시간 편차를 사용합니다. " ( 링크 )
koyae

22

Postgresql 9.5 에서 잘 작동하는 것 같습니다 .

SELECT current_setting('TIMEZONE');

나는 당신의 명령을 실행했고 15,200 행을 돌려 받았지만 모두 동일한 시간대입니다.
Subhendu Mahanta

9

이 답변을 참조하십시오 : 출처

timezone이 postgresql.conf 또는 서버 명령 줄 옵션에 지정되지 않은 경우 서버는 TZ 환경 변수의 값을 기본 시간대로 사용하려고 시도합니다. TZ가 정의되지 않았거나 PostgreSQL에 알려진 시간대 이름이 아닌 경우 서버는 C 라이브러리 함수 localtime ()의 동작을 확인하여 운영 체제의 기본 시간대를 확인하려고 시도합니다. 기본 시간대는 PostgreSQL의 알려진 시간대 중에서 가장 가까운 시간대로 선택됩니다. (이 규칙은 지정되지 않은 경우, log_timezone의 기본 값을 선택하는 데 사용됩니다.) 소스를

즉, 시간대를 정의하지 않으면 서버가 C 라이브러리 함수 localtime ()의 동작을 확인하여 운영 체제의 기본 시간대를 결정하려고합니다.

timezone이 postgresql.conf 또는 서버 명령 줄 옵션에 지정되지 않은 경우 서버는 TZ 환경 변수의 값을 기본 시간대로 사용하려고 시도합니다.

시스템의 시간대를 설정하는 것이 실제로 가능한 것 같습니다.

셸에서 OS 현지 시간대를 가져옵니다. psql에서 :

=> \! date +%Z

2
date +%Z클라이언트의 시간대를 반환 명령이 아닌 서버는 당신이를 통해 연결 한 것psql
유진 Konkov

9

다음 스크립트로 시간대에 액세스 할 수 있습니다.

SELECT * FROM pg_timezone_names WHERE name = current_setting('TIMEZONE');
  • current_setting ( 'TIMEZONE')은 설정의 대륙 / 수도 정보를 제공합니다.
  • pg_timezone_names pg_timezone_names보기는 SET TIMEZONE에서 인식하는 시간대 이름 목록과 관련 약어, UTC 오프셋 및 일광 절약 상태를 제공합니다.
  • 뷰 (pg_timezone_names)의 이름 열은 시간대 이름입니다.

출력은 다음과 같습니다.

name- Europe/Berlin, 
abbrev - CET, 
utc_offset- 01:00:00, 
is_dst- false
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.