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() 函数 s 来拆分时间戳的两个部分,如 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 付出的所有努力,没有一个更整洁的解决方案是相当烦人的。
“我不明白你是怎么得到的
-05:00。”
在我的原始示例中,我使用了'YYYY-MM-DD HH24:MI:SS-TZH:TZM' 的格式掩码。这会将时区中的 - 解释为分隔符而不是减号。因此它返回+05:00。我已经更正了我的代码示例以删除最后一个破折号。现在时区正确呈现为 -05:00。如有任何混淆,请见谅。