ORA-01843:没有有效的月份-java到sql日期转换

时间:2016-06-20 18:48:53

标签: java oracle

我需要从java向Oracle数据库插入特定的时间戳; 我的oracle列ChangeTime是DATA_TYPE = TIMESTAMP(6),期望值格式为 - 08-APR-16 09.52.22.000000000 AM。

我已经在我的java代码中将java.sql.Timestamp转换为字符串:

String changeTimestamp = new Timestamp(System.currentTimeMillis()).toString();

我的SQL PreparedStatement如下:

    <property name="updatePersonDetail">
        <bean class="com.cigna.ibor.dao.UpdateWithParameters" parent="dao.template">
            <constructor-arg ref="mydb.ds" />
            <constructor-arg>
                <value>
                    <![CDATA[
UPDATE MYDB.INDIV_DETAIL
SET   PERSON_ID =?
    , LAST_OPER_ID = ?
    , LAST_TIMESTMP =  ?,

WHERE SRC_LOC_CD = ?
  AND SRC_SYS_ID = ?
                    ]]>
                </value>
            </constructor-arg>
            <constructor-arg>
                <list>
                    <ref local="java.sql.Types.VARCHAR" />
                    <ref local="java.sql.Types.VARCHAR" />
                    <ref local="java.sql.Types.VARCHAR" />
                    <ref local="java.sql.Types.VARCHAR" />
                    <ref local="java.sql.Types.VARCHAR" />

                </list>
            </constructor-arg>
        </bean>
    </property>

我在运行时遇到 java.sql.SQLDataException:ORA-01843:无效月份。 任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

如果您的字符串格式为08-APR-16 09.52.22.000000000 AM,那么您可以指定格式而不是依赖隐式转换:

UPDATE MYDB.INDIV_DETAIL
SET   PERSON_ID =?
    , LAST_OPER_ID = ?
    , LAST_TIMESTMP = TO_TIMESTAMP(?, 'DD-MON-RR HH:MI:SS.FF9 AM'),
WHERE SRC_LOC_CD = ?
  AND SRC_SYS_ID = ?

格式模型必须与您实际传递的内容相匹配。听起来你假设这是会话的NLS_TIMESTAMP_FORMAT设置,但错误表明情况并非如此。不要混淆客户端/ IDE如何显示查询的日期/时间戳与存储方式 - 没有内在格式,Oracle使用的内部表示与显示的值完全不同。

即使这样,您也假设Oracle会话的数据语言与Java值匹配 - 例如,它们都使用英文月份名称。如果您不确定数据库会话的日期语言是什么,但是知道Java字符串始终是英语,您可以specify that in the conversion

    , LAST_TIMESTMP = TO_TIMESTAMP(?, 'DD-MON-RR HH:MI:SS.FF9 AM'
      , 'NLS_DATE_LANGUAGE=ENGLISH'),

如果您有一个Java时间戳值,当前正在将其转换为该格式的字符串以进行此调用,您可以将其作为时间戳传递给,而不是将其转换为字符串和从字符串转换。