如何将iso-8601类型的日期插入到oracle数据库中

时间:2013-12-23 18:41:58

标签: oracle plsql oracle11g iso

我正在使用Oracle 11g并试图找出如何将此日期插入到我的表中。日期似乎是ISO-8601,但是7个零让我感到困惑。

Insert into myTestTable (myDate) values ('2013-01-22T00:00:00.0000000-05:00');

我试图在没有运气的情况下格式化日期。我得到的错误是ORA-01861文字与格式字符串不匹配。

2 个答案:

答案 0 :(得分:7)

首先,列必须是TIMESTAMP WITH TIME ZONE类型才能保存您尝试插入的值。 Oracle DATE仅精确到秒,并且不包含时区。

七个零是小数秒。 TIMESTAMP WITH TIME ZONE的默认精度恰好是七位小数。要为秒指定三个小数位,请将列定义为TIMESTAMP(3) WITH LOCAL TIME ZONE

SYSTIMESTAMP返回的实际小数位数(服务器的当前时间戳)取决于操作系统。我的本地Windows 7 Oracle返回三个有效小数位,而我的一个客户端的Solaris OS返回六位有效小数位。

至于插入值,如果你这样做......

insert into myTestTable (myTS) values ('2013-01-22T00:00:00.0000000-05:00');

... Oracle将尝试使用其当前NLS_TIMESTAMP_TZ_FORMAT设置转换时间戳。您可以像这样查询设置:

SELECT *
FROM NLS_Session_Parameters
WHERE Parameter = 'NLS_TIMESTAMP_TZ_FORMAT';

PARAMETER               VALUE
----------------------- ----------------------------
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR

我得到的结果是“出厂默认值”。你的可能是相同的,你可以看到它与你给出的格式不匹配,因此转换失败。

正如另一个答案正确指出的那样,您可以使用TO_TIMESTAMP_TZ函数和格式字符串将字符串转换为时间戳。您还可以使用ANSI时间戳文字:

insert into myTestTable (myTS)
  values (TIMESTAMP '2013-01-22T00:00:00.0000000-05:00');

Oracle记录时间戳文字here。该链接涵盖了所有类型的文字,因此您需要在屏幕上滚动约三分之二(或进行查找)以获得时间戳文字。

答案 1 :(得分:2)

这是答案。

insert into myTestTable (myDate) values 
(to_timestamp_tz('2013-01-22T00:00:00.0000000-05:00',
 'YYYY-MM-DD"t"HH24:MI:SS.FF7TZR'));