Oracle-都获取XML日期字符串并将其转换为日期

时间:2019-08-12 19:35:47

标签: sql xml oracle oracle11g

我正在解码XML文件(作为CLOB存储在数据库中),并且有一个字段要提取并存储为日期。

如果我选择该字段,则会得到数据:

select xmlquery('declare namespace wx = "http://weather.obsfucate.com/rest-3.4/doc/"; //wx:validDateTime/text()' 
       PASSING XMLTYPE(wx.xml_result) 
       RETURNING CONTENT) as VALID_DATETIME
from OPSADM.WEATHER_XML wx
where DATATYPE = 'DailyObservation'

返回'2019-08-08T08:00:00 + 00:00'

如果我尝试将其插入具有DATE数据类型的表中,则会给我一个错误:“ ORA-00932:不一致的数据类型:预期的DATE--”

所以我尝试进行转换:

 select to_timestamp_tz ('2019-08-08T08:00:00+00:00', 'yyyy-mm-dd"T"hh24:mi:ssTZH:TZM')  OrigTime
 from dual

返回'8/8/2019 8:00:00.000000000 AM +00:0'

但是,如果我尝试将两者放在一起,请将to_timestamp_tz放在我的xmlquery周围

select to_timestamp_tz (xmlquery('declare namespace wx = "http://weather.obsfucate.com/rest-3.4/doc/"; //wx:validDateTime/text()' 
       PASSING XMLTYPE(wx.xml_result) 
       RETURNING CONTENT), 'yyyy-mm-dd"T"hh24:mi:ssTZH:TZM') as VALID_DATETIME
from OPSADM.WEATHER_XML wx
where DATATYPE = 'DailyObservation'

它返回错误:“ ORA-00932:数据类型不一致:预期-得到-”

所以,它甚至不知道现在期望什么。

This got me part of the way.

I'm pretty sure I'm missing something important that this shows.,此代码使我成为了其中的一部分:

 select cast(to_timestamp_tz ('2019-08-08T08:00:00+00:00', 'yyyy-mm-dd"T"hh24:mi:ssTZH:TZM')
 at time zone 'US/Mountain' as date) as MountainTime
 , to_timestamp_tz ('2019-08-08T08:00:00+00:00', 'yyyy-mm-dd"T"hh24:mi:ssTZH:TZM')  OrigTime
 from dual

我认为这显示了我的时区:

 select sessiontimezone, dbtimezone from dual

返回-07:00和+00:00,我认为该数据库位于美国山区时间或中部时间。

我想提取XML日期,将其转换为可以插入表中的适当日期。我在做什么错了?

1 个答案:

答案 0 :(得分:1)

您可能需要投射它:

select 
  to_timestamp_tz (CAST(xmlquery('declare namespace wx = "http://weather.obsfucate.com/rest-3.4/doc/"; //wx:validDateTime/text()' 
  PASSING XMLTYPE(wx.xml_result) 
  RETURNING CONTENT) AS VARCHAR2(100)), 'yyyy-mm-dd"T"hh24:mi:ssTZH:TZM') as VALID_DATETIME
from OPSADM.WEATHER_XML wx
where DATATYPE = 'DailyObservation'