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>
注意,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>
但是考虑到Oracle已经为XMLDB付出的所有努力,没有一个更整洁的解决方案是相当恼人的.
“I dont understand how you get
-05:00.”
在我的原始样本中,我使用格式掩码’YYYY-MM-DD HH24:MI:SS-TZH:TZM’.这将时区中的 – 解释为分隔符而不是减号.因此它于05:00返回.我已经更正了我的代码示例以删除最后一个破折号.现在时区正确呈现为-05:00.对不起任何困惑.