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