3

TIMESTAMP WITH TIMEZONEUTC-5(NY)のデータベースからUTCとしてOracleを読み取ろうとしています。

オラクルは私を夢中にさせています:

SELECT 
from_tz(MAX(TIMESTAMPWITHTIMEZONE),'UTC'),
SYS_EXTRACT_UTC(MAX(TIMESTAMPWITHTIMEZONE)),
SYS_EXTRACT_UTC(systimestamp), 
SYSTIMESTAMP AT TIME ZONE 'UTC'
FROM TABLE

結果:

  • SYS_EXTRACT_UTC(systimestamp)私に:2013-02-20 14:59:04、それはおそらく正しいです。

  • SYSTIMESTAMP AT TIME ZONE 'UTC'私に与える:2013-02-20 15:59:04これは私自身の地元のベルリンです-何でも

今、UTCとしてTIMESTAMPWITHTIMEZONE(TIMESTAMP(6))が必要です

  • SYS_EXTRACT_UTC(MAX(TIMESTAMPWITHTIMEZONE))2013-02-20 08:55:01

  • from_tz(MAX(TIMESTAMPWITHTIMEZONE),'UTC')2013-02-20 10:55:01

Srly。オラクル。UTCが欲しいです。

どちらが正しいですか?それとももっと良い方法はありますか?

4

2 に答える 2

8

機能は異なります:

  • SYS_EXTRACT_UTCTIMESTAMP WITH TIMEZONEaをaに変換しますTIMESTAMP(推定されますが、timezone = UTCはありません)。
  • FROM_TZをに変換TIMESTAMPしますTIMESTAMP WITH TIMEZONE

これらの関数を単一の値に適用すると、通常、異なる結果が返されます。

SQL> SELECT sys_extract_utc(localtimestamp) ext,
  2         from_tz(localtimestamp, 'UTC')  from_tz
  3    FROM dual;

EXT                   FROM_TZ
--------------------- ------------------------
2013/02/20 15:34:24   2013/02/20 16:34:24 UTC

最初のケースでは、サーバーのタイムゾーンTIMESTAMP暗黙的に指定され、UTCタイムゾーンで同等のタイムスタンプに変換されます。一般に、暗黙の変換は避けてください。

2番目のケースでは、タイムゾーン間の計算はありません。このFROM_TZ関数は、地理的位置をある時点の変数に追加します。

ちなみに、あなたの例には何か欠けているものがあります:FROM_TZタイプの変数に関数を適用することはできませんTIMESTAMP WITH TIMEZONE(9ir2と11ir2でテストされています):

SQL> select from_tz(systimestamp, 'UTC') from dual;

select from_tz(systimestamp, 'UTC') from dual

ORA-00932: inconsistent datatypes: 
   expected TIMESTAMP got TIMESTAMP WITH TIME ZONE

次のコメントを編集します。

TIMESTAMPあなたの場合、あなたのコラムが時間であり、それらがニューヨークのタイムゾーンを参照していることを知っていると仮定すると、AT TIME ZONE式を使用して次のように変換できUTCます。

SQL> SELECT localtimestamp,
  2         from_tz(localtimestamp, 'America/New_York') AT TIME ZONE 'UTC' utc
  3    FROM dual;

LOCALTIMESTAMP        UTC
--------------------- ------------------------
2013/02/20 17:09:09   2013/02/20 22:09:09 UTC
于 2013-02-20T15:39:48.757 に答える
0

Oracle 18cから、TO_UTC_TIMESTAMP_TZ関数を使用できます。

TO_UTC_TIMESTAMP_TZ関数は、文字列として表される有効なISO8601日付をTIMESTAMPWITHTIMEZONEに変換します。これは、オプションでSYS_EXTRACT_UTC関数への入力として使用できます。

SELECT TO_UTC_TIMESTAMP_TZ(col_name)
FROM tab_name;
于 2018-04-10T19:39:52.927 に答える