将XSD日期xs:dateTime转换为Oracle Date

Mor*_*fee 6 oracle timezone xsd date

我需要从这种格式转换日期:

2002-10-10T12:00:00-05:00 (xs:XML中定义的dateTime)

Oracle日期.

我已经习惯了在PL/SQL中使用这样的:TO_DATE("日在这里","YYYYMMDD"),有没有办法转换这一点的同时保持了时区信息?

谢谢

Rob*_*ijk 9

一个简短的回答:

SQL> select to_timestamp_tz('2002-10-10T12:00:00-05:00','yyyy-mm-dd"T"hh24:mi:sstzh:tzm')
  2    from dual
  3  /

TO_TIMESTAMP_TZ('2002-10-10T12:00:00-05:00','YYYY-MM-DD"T"HH24:MI:SSTZH:TZM
---------------------------------------------------------------------------
10-OCT-02 12.00.00.000000000 PM -05:00

1 row selected.
Run Code Online (Sandbox Code Playgroud)

问候,Rob.


APC*_*APC 7

Oracle日期没有时区信息.您需要使用TIMESTAMP数据类型.

它的工作原理如下:

SQL> desc tz
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER
 TS                                                 TIMESTAMP(6) WITH TIME ZONE
 TNOW                                               TIMESTAMP(6) WITH TIME ZONE

SQL> insert into tz
  2  values (1
  3          , to_timestamp_tz('2002-10-10 12:00:00-05:00'
  4                           , 'YYYY-MM-DD HH24:MI:SSTZH:TZM')
  5          , systimestamp)
  6  /

1 row created.

SQL> select * from tz
  2  /

        ID
----------
TS
---------------------------------------------------------------------------
TNOW
---------------------------------------------------------------------------
         1
10-OCT-02 12.00.00.000000 -05:00
23-AUG-10 17.37.06.502000 +01:00


SQL>
Run Code Online (Sandbox Code Playgroud)

注意,XSD表示法中存在T的棘手问题.这会引发ORA-01858异常,因为它不是Oracle中的有效格式.我确信有一个解决方法,但它目前逃脱了我.


好吧,一个解决方法是应用SUBSTR()函数sto拆分打开时间戳的两个部分,如Bob所示.但应该有一种更优雅的方式.


它可能不符合"优雅"的条件,但因为它是一个字符串,我们可以使用替换函数来摆脱恼人的T:

SQL> insert into tz
  2  values (2
  3          , to_timestamp_tz(translate('2003-10-10T12:00:00-05:00', 'T', ' ')
  4                   , 'YYYY-MM-DD HH24:MI:SSTZH:TZM')
  5          , systimestamp)
  6  /

1 row created.

SQL> select * from tz
  2  /

        ID
----------
TS
---------------------------------------------------------------------------
TNOW
---------------------------------------------------------------------------
         1
10-OCT-02 12.00.00.000000 -05:00
23-AUG-10 17.37.06.502000 +01:00

         2
10-OCT-03 12.00.00.000000 -05:00
23-AUG-10 17.53.37.113000 +01:00


SQL>
Run Code Online (Sandbox Code Playgroud)

但是考虑到Oracle已经为XMLDB付出的所有努力,没有一个更整洁的解决方案是相当恼人的.


"我不明白你怎么得到-05:00."

在我的原始样本中,我使用的是格式掩码'YYYY-MM-DD HH24:MI:SS-TZH:TZM'.这会将-时区解释为分隔符而不是减号.因此它返回+05:00.我已经更正了我的代码示例以删除最后一个破折号.现在时区正确呈现为-05:00.对不起任何困惑.

  • 如何处理恼人的T,用双引号括起来:'YYYY-MM-DD"T"HH24:MI:SSTZH:TZM' (2认同)