首页 文章

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

提问于
浏览
2

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

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

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

2 回答

  • 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 . 该链接涵盖了所有类型的文字,因此您需要在屏幕上滚动大约三分之二(或执行查找)以获取时间戳文字 .

  • 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'));
    

相关问题