4

当我尝试执行以下代码时,它给了我一个java.sql.SQLException: ORA-01861: literal does not match format string错误。

我正在尝试将一些列值从customer1_details表复制到customer2_details表。我要移动的列数据类型是TIMESTAMP(6)for TIME_REGISTERED, DATE_DISCHARGEDcolumns 和DATE_OF_BIRTHcolumn 的数据类型是DATE

    try
    {
        Connection conn=Address.getOracleConnection();  
        int id = 1;     
        Date dob = null;
        Timestamp timereg = null,datedischarged = null;

        Statement stmt=conn.createStatement();
        ResultSet res=stmt.executeQuery("SELECT TIME_REGISTERED,DATE_DISCHARGED,DATE_OF_BIRTH from customer1_details WHERE customer_id = '"+id+"' ");
             if(res.next())
             {      
                 timereg=res.getTimestamp("TIME_REGISTERED");           
                 datedischarged=res.getTimestamp("DATE_DISCHARGED"); 
                 dob=res.getDate("DATE_OF_BIRTH");     
             }              

            String sql1="INSERT INTO customer2_details(TIME_REGISTERED_3,DATE_DISCHARGED_3,DATE_OF_BIRTH,customer_ID) "
    + "VALUES('"+timereg+"','"+datedischarged+"','"+dob+"','"+id+"') ";

        PreparedStatement pst=conn.prepareStatement(sql1);
        pst.executeUpdate();
        pst.close();       
        conn.close();
    }
    catch(Exception e)
    {            System.out.print(e);           }  

如果有人提供答案会更有帮助without using INSERT INTO ... SELECT ... statement

4

3 回答 3

2

你可以在一个语句中使用如下查询来做到这一点:

"INSERT INTO customer2_details (TIME_REGISTERED_3,DATE_DISCHARGED_3,DATE_OF_BIRTH,customer_ID)
SELECT TIME_REGISTERED,DATE_DISCHARGED,DATE_OF_BIRTH, customer_id
from customer1_details WHERE customer_id = '"+id+"' "
于 2013-05-04T19:41:45.480 回答
1

使用 getString() 将时间戳读取为字符串;

或在您的 java Timestamp 对象实例中调用 toString() 。

String sql1="INSERT INTO customer2_details(TIME_REGISTERED_3,DATE_DISCHARGED_3,DATE_OF_BIRTH,customer_ID) "
    + "VALUES('"+timereg.toString()+"','"+datedischarged.toString()+"','"+dob.toString()+"','"+id+"') ";
于 2013-05-07T18:36:25.573 回答
1

这很可能是由于将 Date 和 Timestamp 变量作为字符串传递给 insert 语句引起的。

当您插入或更新 Date 或 Timestamp 值时,有一种默认格式,您可以在其中将这些值作为字符串传递。你传递的是java关于如何将日期和时间戳转换为字符串的想法。这两个好像不太对。

您最好的选择可能是使用绑定变量,那么框架应该会处理好这一点。

另一种方法是使用 Oracle 的 to_date() 函数,您可以在其中指定格式字符串。然后,您将定义一个格式字符串,它将 java 将日期表示为字符串的方式。但是,我不确定 java 表示是否取决于语言环境。如果是这样,您将不得不编写自己的 date_to_string() 方法,该方法总是以相同的格式返回日期,或者您的程序可能在某些计算机上运行,​​但在其他具有不同语言环境的计算机上运行。

最后你可以做一个完全绕过java层的插入选择。

于 2013-05-04T19:42:53.533 回答