web-dev-qa-db-ja.com

SQLを介して「YYYY-MM-DD HH24:MI:SS TMZ」に変換されたOracle Dateデータ型

次の方法で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で返される必要があります。

私はGoogleを使いましたが、Dateデータ型については以下を見つけました:

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?

この問題を解決するにはどうすればよいですか?

10
James Gallagher

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

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

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

タイムゾーンCST/CSTで有効であることがわかっているDatedをタイムゾーン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
20
Vincent Malgrat

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
2
DazzaL