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を参照してください。
パトリック

1
pg_timezone_namesテーブルでは、CETは略語として定義され、たとえば「Europe / Berlin」は名前として定義されています。略語ではなく名前が必要です。
deutro 2015年

以前のコメントで示したリンクは、ファイルを編集して必要なものを提供する方法を示しています。それはそれが得るのと同じくらい良いです。
パトリック

それで、postgresが、私が「ヨーロッパ/ベルリン」にいるのか「ヨーロッパ/アムステルダム」にいるのかを、タイムゾーンCETにいるというだけで伝える方法はありませんか?
deutro 2015年

質問を編集して「私は入っている」と定義できますか?サーバーは(通常)固定された場所にあり、タイムゾーンはオペレーティングシステムまたは構成ファイルから取得されます。tz名はサーバーと同じくらい固定されています。では、サーバーまたはデータベース内のデータのタイムゾーン名が本当に必要ですか?
パトリック

回答:


121

最も一般的なケースでは、PostgreSQLだけを使用してこれを行うことはできないと思います。PostgreSQLをインストールするときは、タイムゾーンを選択します。デフォルトでは、オペレーティングシステムのタイムゾーンを使用することになると確信しています。これは通常、パラメータ「timezone」の値としてpostgresql.confに反映されます。ただし、値は「localtime」になります。この設定は、SQLステートメントで確認できます。

show timezone;

ただし、postgresql.confのタイムゾーンを「Europe / Berlin」のようなものに変更するshow timezone;と、「localtime」ではなくその値が返さます。

したがって、あなたの解決策には、postgresql.confの「timezone」をデフォルトの「localtime」ではなく明示的な値に設定することが含まれると思います。


ご回答有難うございます。システムのタイムゾーンを取得できないのは奇妙なことです。
deutro 2015年

3
また、タイムゾーンを設定するには、を使用できますset timezone to 'UTC'
ivkremer 2017

@ivkremer:set timezone1つのクライアントセッションのタイムゾーンを設定します。PostgreSQLサーバーのタイムゾーンは設定されません。
マイクシェリル '猫のリコール'

@ MikeSherrill'CatRecall 'ありがとうございます。チェックしませんでした。
ivkremer 2017

25

これは、問題OPに対処するのに役立つ場合と役に立たない場合がありますが、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
別のユーザーを使用すること提案しましたが、半分と4分の1の両方のタイムゾーンがあるという事実を無視しているSELECT EXTRACT(TIMEZONE_HOUR FROM now())ため、これはやや危険です。@giladMayani
koyae

2
「北朝鮮、ニューファウンドランド、インド、イラン、アフガニスタン、ベネズエラ、ビルマ、スリランカ、マルケサス、およびオーストラリアの一部では、標準時から30分ずれています。ネパールなどの一部の国、および次のような一部の州チャタム諸島、15分偏差を使用してください。」リンク
koyae 2016年

22

Postgresql9.5では正常に動作するようです:

SELECT current_setting('TIMEZONE');

コマンドを実行すると、15,200行が返されましたが、すべて同じタイムゾーンです。
SubhenduMahanta20年

9

この回答を参照してください:ソース

postgresql.confまたはサーバーのコマンドラインオプションでタイムゾーンが指定されていない場合、サーバーはTZ環境変数の値をデフォルトのタイムゾーンとして使用しようとします。TZが定義されていないか、PostgreSQLで認識されているタイムゾーン名ではない場合、サーバーはCライブラリ関数localtime()の動作をチェックして、オペレーティングシステムのデフォルトのタイムゾーンを決定しようとします。デフォルトのタイムゾーンは、PostgreSQLの既知のタイムゾーンの中で最も一致するものとして選択されます。(これらのルールは、指定されていない場合、log_timezoneのデフォルト値を選択するためにも使用されます。)source

これは、タイムゾーンを定義しない場合、サーバーはCライブラリ関数localtime()の動作をチェックすることにより、オペレーティングシステムのデフォルトのタイムゾーンを決定しようとすることを意味します。

postgresql.confまたはサーバーのコマンドラインオプションでタイムゾーンが指定されていない場合、サーバーはTZ環境変数の値をデフォルトのタイムゾーンとして使用しようとします。

システムのタイムゾーンを設定することは確かに可能であるようです。

シェルからOSのローカルタイムゾーンを取得します。psqlの場合:

=> \! date +%Z

2
date +%Zコマンドは、接続したサーバーではなく、クライアントのタイムゾーンを返しますpsql
Eugen Konkov 2018

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.