13

次の方法で Oracle Data データ型列にアップロードするアプリケーションがあります。

TO_TIMESTAMP_TZ('2012-10-09 1:10:21 CST','YYYY-MM-DD HH24:MI:SS TZR')

ここで、このデータ列から次の形式とタイムゾーンを取得する必要があります: 'YYYY-MM-DD HH24:MI:SS CDT'

注: 日付は CST でアップロードされますが、CDT で返す必要があります。

私はグーグルで検索しましたが、日付データ型については以下しか見つかりませんでした:

SELECT dateColumn From dateTable;
09-NOV-12

SELECT TO_CHAR(dateColumn,'YYYY-MM-DD HH24:MI:SS') From dateTable;
2012-10-09 1:10:21

私も次のことを試しました:

TO_TIMESTAMP_TZ(dateColumn,'YYYY-MM-DD HH24:MI:SS CDT')
data format not recognized

TO_TIMESTAMP_TZ(CRTE_DT,'YYYY-MM-DD HH24:MI:SS TZH:TZM')
09-NOV-12 1:10:21 AM +01:00
don't understand why this does not come back as YYYY-MM-DD?

どうすればこの問題を解決できますか?

4

2 に答える 2

20

あなたの質問には少し混乱があります:

  • データ型はタイム ゾーン コンポーネントを保存しDateません。TIMESTAMP WITH TIME ZONEを に挿入すると、この情報は切り捨てられ、永久に失われますDate
  • 日付を画面に表示するか、文字 API (XML、ファイルなど) を介して別のシステムに送信する場合は、TO_CHAR関数を使用します。Oracle では、aDateには形式がありません。ある時点です。
  • 相互に、 aを aTO_TIMESTAMP_TZに変換するために使用しますが、これは aを a に変換しません。VARCHAR2TIMESTAMPDateTIMESTAMP
  • (または)FROM_TZにタイム ゾーン情報を追加するために使用します。TIMESTAMPDate
  • Oracle では、CSTはタイム ゾーンですが、CDTそうではありません。CDTサマータイム情報です。
  • さらに複雑なことに、CST/CDT( -05:00) とCST/CST( -06:00) は明らかに異なる値を持ちますが、タイム ゾーンCSTはデフォルトで日付に応じて夏時間情報を継承します。

そのため、変換は見た目ほど単純ではない場合があります。

Date dtime zone で有効であることがわかっている a を time zoneCST/CSTで同等のものに変換すると仮定すると、次のCST/CDTように使用します。

SQL> SELECT from_tz(d, '-06:00') initial_ts,
  2         from_tz(d, '-06:00') at time zone ('-05:00') converted_ts
  3    FROM (SELECT cast(to_date('2012-10-09 01:10:21',
  4                              'yyyy-mm-dd hh24:mi:ss') as timestamp) d
  5            FROM dual);

INITIAL_TS                      CONVERTED_TS
------------------------------- -------------------------------
09/10/12 01:10:21,000000 -06:00 09/10/12 02:10:21,000000 -05:00

ここでは、デフォルトのタイムスタンプ形式が使用されています。フォーマットを明示的に指定できます。

SQL> SELECT to_char(from_tz(d, '-06:00'),'yyyy-mm-dd hh24:mi:ss TZR') initial_ts,
  2         to_char(from_tz(d, '-06:00') at time zone ('-05:00'),
  3                 'yyyy-mm-dd hh24:mi:ss TZR') converted_ts
  4    FROM (SELECT cast(to_date('2012-10-09 01:10:21',
  5                              'yyyy-mm-dd hh24:mi:ss') as timestamp) d
  6            FROM dual);

INITIAL_TS                      CONVERTED_TS
------------------------------- -------------------------------
2012-10-09 01:10:21 -06:00      2012-10-09 02:10:21 -05:00
于 2013-04-05T13:09:26.607 に答える
2

Oracle で TimestampTZ を変換するには、次のようにします。

TO_TIMESTAMP_TZ('2012-10-09 1:10:21 CST','YYYY-MM-DD HH24:MI:SS TZR') 
  at time zone 'region'

ここを参照してください: http://docs.oracle.com/cd/E11882_01/server.112/e10729/ch4datetime.htm#NLSPG264

リージョンについてはこちら: http://docs.oracle.com/cd/E11882_01/server.112/e10729/applocaledata.htm#NLSPG0141

例えば:

SQL> select a, sys_extract_utc(a), a at time zone '-05:00' from (select TO_TIMESTAMP_TZ('2013-04-09 1:10:21 CST','YYYY-MM-DD HH24:MI:SS TZR') a from dual);

A
---------------------------------------------------------------------------
SYS_EXTRACT_UTC(A)
---------------------------------------------------------------------------
AATTIMEZONE'-05:00'
---------------------------------------------------------------------------
09-APR-13 01.10.21.000000000 CST
09-APR-13 06.10.21.000000000
09-APR-13 01.10.21.000000000 -05:00


SQL> select a, sys_extract_utc(a), a at time zone '-05:00' from (select TO_TIMESTAMP_TZ('2013-03-09 1:10:21 CST','YYYY-MM-DD HH24:MI:SS TZR') a from dual);

A
---------------------------------------------------------------------------
SYS_EXTRACT_UTC(A)
---------------------------------------------------------------------------
AATTIMEZONE'-05:00'
---------------------------------------------------------------------------
09-MAR-13 01.10.21.000000000 CST
09-MAR-13 07.10.21.000000000
09-MAR-13 02.10.21.000000000 -05:00

SQL> select a, sys_extract_utc(a), a at time zone 'America/Los_Angeles' from (select TO_TIMESTAMP_TZ('2013-04-09 1:10:21 CST','YYYY-MM-DD HH24:MI:SS TZR') a from dual);

A
---------------------------------------------------------------------------
SYS_EXTRACT_UTC(A)
---------------------------------------------------------------------------
AATTIMEZONE'AMERICA/LOS_ANGELES'
---------------------------------------------------------------------------
09-APR-13 01.10.21.000000000 CST
09-APR-13 06.10.21.000000000
08-APR-13 23.10.21.000000000 AMERICA/LOS_ANGELES
于 2013-04-05T12:27:06.613 に答える