你的问题有点混乱:
- 数据类型不
Date
保存时区组件。TIMESTAMP WITH TIME ZONE
当您将 a插入a 时,这条信息将被截断并永远丢失Date
。
- 当您想在屏幕上显示日期或通过字符 API(XML、文件...)将其发送到另一个系统时,您可以使用该
TO_CHAR
功能。在 Oracle 中,aDate
没有格式:它是一个时间点。
- 相反,您将使用
TO_TIMESTAMP_TZ
将 a 转换VARCHAR2
为 a TIMESTAMP
,但这不会将 a 转换Date
为 a TIMESTAMP
。
- 您用于
FROM_TZ
将时区信息添加到 a TIMESTAMP
(或 a 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