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

Jam*_*her 10 sql oracle select date

我有一个应用程序通过以下方式上传到Oracle Data数据类型列:

TO_TIMESTAMP_TZ('2012-10-09 1:10:21 CST','YYYY-MM-DD HH24:MI:SS TZR')
Run Code Online (Sandbox Code Playgroud)

我现在需要从此数据列中提取以下格式和时区:'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
Run Code Online (Sandbox Code Playgroud)

我也尝试了以下内容:

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?
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?

Vin*_*rat 20

你的问题有点混乱:

  • 一个Date数据类型不保存时区的组成部分.这条信息被截断,并永远失去了,当你插入一个TIMESTAMP WITH TIME ZONE成一个Date.
  • 如果要在屏幕上显示日期或通过字符API(XML,文件...)将日期发送到另一个系统,则可以使用该TO_CHAR功能.在Oracle中,a Date没有格式:它是一个时间点.
  • 相反,您将使用TO_TIMESTAMP_TZ将a转换VARCHAR2为a TIMESTAMP,但这不会将a转换Date为a TIMESTAMP.
  • 您可以使用FROM_TZ将时区信息添加到TIMESTAMP(或a Date).
  • 在Oracle中,CST是一个时区,但CDT不是.CDT是一种夏令时信息.
  • 更复杂的是,CST/CDT(-05:00)和CST/CST(-06:00)显然会有不同的值,但CST默认情况下,时区将根据日期继承夏令时信息.

因此,您的转化可能并不像看起来那么简单.

假设您要将Date d时区有效的转换为时区CST/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
Run Code Online (Sandbox Code Playgroud)

我的默认时间戳格式已在此处使用.我可以明确指定一种格式:

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
Run Code Online (Sandbox Code Playgroud)