2016-11-01 2 views
2

次の問合せを使用してOracleデータベースからUTCタイムスタンプを取得すると、問題が発生しますか?私は正しい日付を取得するために、データベースのtimezoneパラメータを変更したくありません。私はしたくない。alter database set time_zone。現時点ではOracleのUTCタイムスタンプを取得しようとしていますが、 "from_tz"を使用して問題が発生しますか?

私のクエリは次のとおりです。

select from_tz(CAST (sys_extract_utc(systimestamp) AS TIMESTAMP), '+00:00') from dual; 

私はこのクエリは関係なく、EST/EDT・ステータスのすべての状況で正しいUTCの日付になりますかどうかを知りたいと思います。

+0

あなたは単に 'select sys_extract_utc(systimestamp)from dual;'を実行することができます - それだけです。 'from_tz(... sys_extract_utc() '+00:00')'を使うことは冗長です。 –

+0

はい、タイムゾーンの追加は含まれていません。私は一貫したデータを探しています。そのクエリの戻り値の型はまだ 'TIMESTAMP WITH TIME ZONE'ですか? –

+1

'EXTRACT_UTC'は' TIMESTAMP'値を返します。 'TIMESTAMP WITH TIME ZONE'を取得したい場合は、' time zoneでsystimestampを選択 'UTC'からdual ';を実行してください。 –

答えて

1

あなたの質問は時間帯を設定するだけですが、時間は変換されません。それがあなたが探していたものなら、それは大丈夫です。現地時間は午前3時です。午前3時はUTCに戻ります。 私はあなたがそのクエリを探していると思う:

select cast(sysdate as timestamp) at time zone 'UTC' from dual; 

そして

select from_tz(cast(systimestamp at time zone 'UTC' as timestamp), '+0:00') from dual; 
+0

ありがとうございます。 2番目のクエリで気づいたことの1つは、マシンの末尾のデータを整理するように見えるということです。例: '選択FROM_TZ(TIMESTAMP AS CAST(sys_extract_utc(SYSTIMESTAMP))、 '00:00')、デュアルからutc2としてutc1として、 \t FROM_TZ(タイムスタンプとしてキャスト(SYSDATE)、 'UTC');'結果で: '2016年11月1日5:36:36.503812 PM +00:00(UTC1用)および\t' 2016年11月1日、1:36:36.000000 PM +00:00(UTC2用) –

+0

は差があること秒の部分「36.503812」は「36.000000」になる。 –

+0

@JohnAugustはキャストする予定じゃないの?あなたはcast' – Kacper

2

を適用し、私はあなたのクエリに何か問題が表示されません。単にあなたがあなたのセッションのためにUTCに仕事をしたい場合、あなたは可能性があることに注意してください:あなたの全体のセッションのためにあなたのCURRENT_TIMESTAMP(およびLOCALTIMESTAMP)を変更します

ALTER SESSION SET TIME_ZONE = '0:00'; 
select CURRENT_TIMESTAMP from dual; 

出力

11/1/2016 5:48:55.115282 PM +00:00 

を。

0

いくつかの一般的な注意事項:

SYSTIMESTAMPSYSDATEは、データベースサーバーのオペレーティングシステムのタイムゾーンに与えられています。したがって、データベースのタイムゾーン(すなわち、DBTIMEZONE)の変更は何も変更しません。

CAST (sys_extract_utc(systimestamp) AS TIMESTAMP)、resp。 cast(systimestamp at time zone 'UTC' as timestamp)に問題があります。タイムスタンプをUTCに変換しますが、CAST(... AS TIMESTAMP)によって、その値からタイムゾーン情報が削除されます。それ以上の変換(たとえば、TIMESTAMP WITH TIME ZONE値)を実行したい場合は、入力されたUTC値はSESSIONTIMEZONE値と見なされます。

from_tz(CAST (sys_extract_utc(systimestamp) AS TIMESTAMP), '+00:00')には、以下のん:

  1. をデータベースサーバーのオペレーティングシステムのタイムゾーンの現在時刻を取得し、タイムゾーン情報が含まれています。

    を:
  2. cast(sysdate as timestamp) at time zone 'UTC'は、以下行い、この値にカット時間帯情報、UTCに

正しい出力が、冗長変換を

  • 追加タイムゾーン情報(+00:00)を今回の変換
    1. 時間内に現在時刻を取得するデータベースサーバーのオペレーティングシステムのゾーンをタイムゾーン情報なしで変更できます。
    2. TIMESTAMPにキャスト(すべてでは基本的には効果なし)
    3. あなたのローカル・セッションのタイムゾーン(SESSIONTIMEZONE)の時間としてこの値を考慮し、UTCに変換します。データベースサーバーのオペレーティングシステムのタイムゾーンはローカルのセッションのタイムゾーンと同じである場合にのみ

    正しい出力が、そうでなければ、間違った結果を取得します。

    from_tz(cast(systimestamp at time zone 'UTC' as timestamp), '+0:00')には、以下のん:

    1. をデータベースサーバーのオペレーティングシステムのタイムゾーンの現在時刻を取得し、タイムゾーン情報が含まれています。
    2. UTCこの時間換算
    3. カット時間帯情報
    4. 追加この値にタイムゾーン情報(+00:00

    正しい出力が、冗長変換

    from_tz(cast(systimestamp as timestamp), '+0:00')は、以下ずに:

    1. データベースサーバーのオペレーティングシステムのタイムゾーンの現在時刻を取得し、タイムゾーン情報が含まれています。データベースサーバーのオペレーティング・システムのタイムゾーンはUTCである場合にのみ、この値に
    2. カットタイムゾーン情報は
    3. 追加のタイムゾーン情報(+00:00

    正しい出力。

  • 関連する問題