IT TIP

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

itqueen 2020. 12. 7. 21:22
반응형

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"과 같은 것으로 변경하면 "localtime"대신 해당show timezone;이 반환됩니다 .

따라서 귀하의 솔루션은 postgresql.conf의 "시간대"를 기본 "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)

( 문서 ).


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

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

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

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

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

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

=> \! date +%Z

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

SELECT current_setting('TIMEZONE');

참고 URL : https://stackoverflow.com/questions/28216923/how-do-i-get-the-current-timezone-name-in-postgres-9-3

반응형