あなたの質問には少し混乱があります:
- データ型はタイム ゾーン コンポーネントを保存し
Dateません。TIMESTAMP WITH TIME ZONEを に挿入すると、この情報は切り捨てられ、永久に失われますDate。
- 日付を画面に表示するか、文字 API (XML、ファイルなど) を介して別のシステムに送信する場合は、
TO_CHAR関数を使用します。Oracle では、aDateには形式がありません。ある時点です。
- 相互に、 aを a
TO_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