当前位置: 首页 > 知识库问答 >
问题:

ORA-01843:无效的月份-Java到sql日期转换

孟沛
2023-03-14
String changeTimestamp = new Timestamp(System.currentTimeMillis()).toString();
    <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个答案

刘永望
2023-03-14

如果字符串的格式类似于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字符串总是英语,则可以在转换中指定:

    , LAST_TIMESTMP = TO_TIMESTAMP(?, 'DD-MON-RR HH:MI:SS.FF9 AM'
      , 'NLS_DATE_LANGUAGE=ENGLISH'),
 类似资料:
  • 问题内容: 我使用此查询创建了一个表现 在,当我尝试使用插入一些数据时,遇到此错误。 我做错了什么? 问题答案: 不是日期,而是一个字符串。 当使用session参数的值作为格式掩码将Oracle非日期文字插入到列中时,Oracle将对其进行隐式处理( 注意:这是一个session参数,属于客户端;它不是全局设置 )。如果非日期文字与该格式匹配,则它将起作用(如果不匹配,则它将不起作用)-但是,如

  • 我在Oracle DB中有一个列,它是数据类型。存储在此列中的典型值类似于。我试图得到所有的记录,其中该专栏有记录后2015年8月1日。 但是,我得到的是。我哪里做错了?

  • 我在尝试从按日期筛选的表中选择数据时遇到了一个问题。 例如: null 此选择的结果是:

  • NLS语言是美国语言。

  • 我使用以下查询创建了一个表 现在,当我尝试使用SQL错误:ORA-01843:not a valid month。 我做错了什么?

  • 我希望在oracle数据库11.2.0.4版上的PL/SQL ETL进程中插入具有时间戳列的表中的数据 如果在Toad中运行“Create INSERT from seletcted row”,将得到以下SQL命令: 在PL/SQL中,我生成一个varchar2/string,类似于: