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

Posted

技术标签:

【中文标题】如何将iso-8601类型的日期插入oracle数据库【英文标题】:how to insert iso-8601 type date into oracle database 【发布时间】:2013-12-23 18:41:58 【问题描述】:

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

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

我尝试格式化日期,但没有成功。我得到的错误是 ORA-01861 文字与格式字符串不匹配。

【问题讨论】:

【参考方案1】:

首先,列必须是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。该链接涵盖了所有类型的文字,因此您需要向下滚动大约三分之二的屏幕(或进行查找)才能获得时间戳文字。

【讨论】:

【参考方案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'));

【讨论】:

以上是关于如何将iso-8601类型的日期插入oracle数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何解析 ISO 8601 格式的日期?

如何将 Excel 中的日期转换为 ISO 8601 格式

如何使用 PHP 将日期显示为 iso 8601 格式

如何在 MySQL 数据库中存储 UTC ISO8601 日期?

如何将 iso 8601 日期发送到后端?

如何获取 ISO-8601 GMT/UTC 年周数