現在のタイムゾーン名を取得したい。私がすでに達成したことは、utc_offset /タイムゾーンの略語を取得することです:
SELECT * FROM pg_timezone_names WHERE abbrev = current_setting('TIMEZONE')
これにより、このタイムゾーンの大陸/首都のすべての組み合わせが得られますが、正確なタイムゾーンではありません。たとえば、次のようになります:
Europe/Amsterdam
Europe/Berlin
サーバーはベルリンにあり、サーバーのタイムゾーン名を取得したい。
私がCETで抱えている問題は、常にUTC + 01:00であり、DST iircを考慮していないことです。
私はこれが最も一般的なケースでPostgreSQLだけを使用して可能だとは思いません。 PostgreSQLをインストールするときに、タイムゾーンを選択します。デフォルトでは、オペレーティングシステムのタイムゾーンを使用することは間違いありません。これは通常、パラメーター「timezone」の値としてpostgresql.confに反映されます。ただし、値は「localtime」になります。この設定は、SQLステートメントで確認できます。
show timezone;
ただし、postgresql.confのタイムゾーンを「ヨーロッパ/ベルリン」などに変更すると、show timezone;
は「localtime」ではなくthat値を返します。
したがって、あなたの解決策には、postgresql.confの「timezone」をデフォルトの「localtime」ではなく明示的な値に設定する必要があると思います。
これは、OPの問題に対処するのに役立つ場合とそうでない場合がありますが、UTCに関連する現在のサーバーのタイムゾーンを取得するには( T1 、技術的に)、次のようにします。
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のデフォルト値を選択するためにも使用されます。) source
つまり、タイムゾーンを定義しない場合、サーバーはCライブラリ関数localtime()の動作をチェックして、オペレーティングシステムのデフォルトのタイムゾーンを決定しようとします。
Timezoneがpostgresql.confまたはサーバーのコマンドラインオプションとして指定されていない場合、サーバーはTZ環境変数の値をデフォルトのタイムゾーンとして使用しようとします。
設定されるシステムのタイムゾーンが実際に可能であるようです。
シェルからOSローカルタイムゾーンを取得します。 psqlの場合:
=> \! date +%Z
Postgresql 9.5で正常に動作するようです:
SELECT current_setting('TIMEZONE');