Oracle Date数据类型,通过SQL转换为'YYYY-MM-DD HH24:MI:SS TMZ'

时间:2013-04-05 11:41:01

标签: sql oracle date select

我有一个应用程序通过以下方式上传到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中返回。

我有谷歌,但只发现以下数据类型:

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?

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:20)

你的问题有点混乱:

  • Date数据类型不保存时区组件。当您将TIMESTAMP WITH TIME ZONE插入Date时,此信息将被截断并永久丢失。
  • 如果要在屏幕上显示日期或通过字符API(XML,文件...)将日期发送到另一个系统,请使用TO_CHAR功能。在Oracle中, Date没有格式:这是一个时间点。
  • 相反,您可以使用TO_TIMESTAMP_TZVARCHAR2转换为TIMESTAMP,但这不会将Date转换为TIMESTAMP
  • 您使用FROM_TZ将时区信息添加到TIMESTAMP(或Date)。
  • 在Oracle中,CST是时区,但CDT不是。 CDT是夏令时信息。
  • 为了使事情进一步复杂化,CST/CDT-05:00)和CST/CST-06:00)显然会有不同的值,但时区CST会继承默认情况下,夏令时信息取决于日期。

所以你的转换可能不像看起来那么简单。

假设您要将时区Date上知道有效的d CST/CST转换为时区CST/CDT的等效内容,您可以使用:< / p>

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

答案 1 :(得分:2)

在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