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

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

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

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

Europe/Amsterdam
Europe/Berlin

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

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



답변

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

show timezone;

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

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


답변

이것은 문제를 해결하는 데 도움이 될 수도 있고 그렇지 않을 수도 있지만 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)

( 문서 ).


답변

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

SELECT current_setting('TIMEZONE');


답변

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

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

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

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

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

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

=> \! date +%Z


답변

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

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


답변