2

データベースサーバーに関連する日付を使用しています。

Oracleでは、完全なタイムゾーンオフセットを取得するには、次のようなものを使用します。

select tz_offset(SESSIONTIMEZONE) from dual;

また

select tz_offset(DBTIMEZONE) from dual;

私の場合、これらは返されます(重要なのは記号が含まれていることです)

-04:00

上記のOracleバージョンとまったく同じ形式の結果を取得するためにPostgresにどのような機能が存在するのか疑問に思いましたか?サーバーがGMT/UTCより遅れているか進んでいることを示す記号を含むサーバーのタイムゾーンオフセットを知る必要があります。

4

2 に答える 2

4

タイムゾーンについては、次のことができます。

SHOW timezone;

または同等のもの:

SELECT current_setting('TIMEZONE');

ただし、これはサーバーが受け入れる任意の形式にすることができるため、、、、などを返す場合がありUTCます。08:00Australia/Victoria

苛立たしいことに、クライアントが使用しているUTCからの時間オフセットを時間と分で報告する組み込み関数がないように見えます。これは私にはちょっとばかげているようです。UTCの現在の時刻をローカルの現在の時刻と比較することにより、オフセットを取得できます。

SELECT age(current_timestamp AT TIME ZONE 'UTC', current_timestamp)`

...しかし、IMOは、からtzオフセットを秒単位で抽出current_timestampし、間隔に変換する方がクリーンです。

SELECT to_char(extract(timezone from current_timestamp) * INTERVAL '1' second, 'FMHH24:MM');

これは、先行ゼロを生成しないことを除いて、目的の結果と一致します。したがって、-05:00-5:00。厄介なことに、先行ゼロを何時間も生成することは不可能であるように思われto_char、次の醜い手動フォーマットが残ります。

CREATE OR REPLACE FUNCTION oracle_style_tz() RETURNS text AS $$
SELECT to_char(extract(timezone_hour FROM current_timestamp),'FM00')||':'||
       to_char(extract(timezone_minute FROM current_timestamp),'FM00');
$$ LANGUAGE 'SQL' STABLE;

以前に使用したハックとCTEの代わりにtimezone_hour、Glennの功績によるものです。timezone_minuteextract(timezone from current_timestamp) * INTERVAL '1' second)

先頭のゼロが必要ない場合は、代わりに次を使用できます。

CREATE OR REPLACE FUNCTION oracle_style_tz() RETURNS text AS $$
SELECT to_char(extract(timezone from current_timestamp) * INTERVAL '1' second, 'FMHH24:MM');
$$ LANGUAGE 'SQL' STABLE;

参照:

于 2012-09-09T10:57:32.037 に答える
1

「to_char」はコンポーネントをフォーマットし、トリムは正の数のための単なるスペースである「sign」文字を取り除きます。

select trim(to_char(extract(timezone_hour from now()), '00')) ||
       ':' ||
       trim(to_char(extract(timezone_minute from now()), '00')) AS tz

時間関数のドキュメントをご覧ください。

于 2012-09-09T00:37:21.093 に答える