次の方法で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?
この問題を解決するにはどうすればよいですか?
あなたの質問には少し混乱があります:
Date
データ型はタイムゾーンコンポーネントを保存しません。 TIMESTAMP WITH TIME ZONE
をDate
に挿入すると、この情報は切り捨てられ、永久に失われます。TO_CHAR
関数を使用します。 Oracleでは、Date
には形式がありません:これは特定の時点です。TO_TIMESTAMP_TZ
を使用してVARCHAR2
をTIMESTAMP
に変換しますが、これはDate
をTIMESTAMP
に変換しません。FROM_TZ
を使用して、タイムゾーン情報をTIMESTAMP
(またはDate
)に追加します。CST
はタイムゾーンですが、CDT
はタイムゾーンではありません。 CDT
は夏時間の情報です。CST/CDT
(-05:00
)とCST/CST
(-06:00
)は明らかに異なる値を持ちますが、タイムゾーンCST
は夏時間の情報を継承しますデフォルトで日付。そのため、変換は見た目ほど単純ではない場合があります。
タイムゾーンCST/CST
で有効であることがわかっているDate
d
をタイムゾーン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
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