将XML日期(ISO-8601)转换为Oracle中的时间戳

时间:2015-02-23 10:59:01

标签: oracle

请帮助我在Oracle中将格式的日期时间从“2015-02-23T16:26:41.485 + 05:30”转换为“23-FEB-15 16.26.41.000000000 AM”。

我在变量中有一个ISO-8601日期字符串:

START_TIME='2015-02-23T16:26:41.485+05:30'

当我使用

to_timestamp(START_TIME,'yyyy-mm-dd"T"hh24:mi:ss.ff3')

我明白了:

Error report:
ORA-01830: date format picture ends before converting entire input string
ORA-06512: at line 55
01830. 00000 -  "date format picture ends before converting entire input string"
*Cause:    
*Action:

1 个答案:

答案 0 :(得分:0)

要将字符串转换为带有时区值的时间戳,您需要the to_timestamp_tz() function

select to_timestamp_tz('2015-02-23T16:26:41.485+05:30',
  'yyyy-mm-dd"T"hh24:mi:ss.ff3tzh:tzm') as result
from dual;

RESULT                             
-----------------------------------
2015-02-23 16:26:41.485000 +05:30   

这包括处理时区偏移的TZH和TZM datetime format model elements;由于这些数据类型无法理解时区,因此无法在to_timestamp()to_date()中使用这些内容。

您似乎想要丢失小数秒部分和时区信息;您可以通过在小数秒精度设置为零的情况下转换为时间戳(无时区)来同时实现两者:

select cast(to_timestamp_tz('2015-02-23T16:26:41.485+05:30',
  'yyyy-mm-dd"T"hh24:mi:ss.ff3tzh:tzm') as timestamp(0)) as result
from dual;

RESULT                             
-----------------------------------
2015-02-23 16:26:41.000000          

但是,丢失时区似乎很危险,除非您确定收到的数据始终与数据库位于同一时区。如果您可能在数据中有不同的时区但由于某种原因不想保留该信息,您也可以转换为特定的时区进行存储,但目前尚不清楚您是否需要此处。如果你没有保留时区或小数秒,你可能最好还是约会。

日期和时间戳在数据库中没有任何固有格式。如果您希望看到以您指定的格式转换回字符串,请将其传递回to_char()调用您想要的格式;但是你的例子有24小时制的小时值和(不正确的)AM / PM指标也不清楚。也许你想要:

select to_char(cast(to_timestamp_tz('2015-02-23T16:26:41.485+05:30',
  'yyyy-mm-dd"T"hh24:mi:ss.ff3tzh:tzm') as timestamp(0)),
  'dd-MON-rr hh:mi:ss.ff9 am') as result
from dual;

RESULT                             
-----------------------------------
23-FEB-15 04:26:41.000000000 PM     

要将START_TIME变量中的值存储在时间戳列中,方法完全相同,只需使用它而不是我上面用过的固定值来演示转换:

cast(to_timestamp_tz(START_TIME, 'yyyy-mm-dd"T"hh24:mi:ss.ff3tzh:tzm')
  as timestamp(0))