JDBC - ORA-01861:literal与格式字符串01861不匹配

时间:2017-03-30 11:32:44

标签: java oracle date jdbc jdatechooser

我从oracle数据库中检索数据时遇到问题 我想使用两个JDatechoosers ...来访问数据 我使用JDatechooser将日期值存储在日期类型的数据库中。

chooser=new JDateChooser();
chooser.setBounds (200, 175, 175, 25);
chooser.setDateFormatString("dd-MM-yyyy");
pstmt.setDate(5, new java.sql.Date(chooser.getDate().getTime()));

我想使用两个JDatechooser值作为休眠来访问两个日期之间的数据..

    chooser = new JDateChooser();       
    chooser.setBounds (100, 15, 100, 25);
    chooser.setDateFormatString("dd-MM-yyyy");
    chooser.addFocusListener (this);

    chooser1 = new JDateChooser();      
    chooser1.setBounds (220, 15, 100, 25);
    chooser1.setDateFormatString("dd-MM-yyyy");
    chooser1.addFocusListener (this);

   ResultSet rs = st.executeQuery("SELECT * FROM Bill WHERE B_DATE BETWEEN '"+new java.sql.Date(chooser.getDate().getTime())+"' AND '"+new java.sql.Date(chooser1.getDate().getTime())+"' ");

我收到错误

  

SQL Error: ORA-01861: literal does not match format string 01861

请帮我解决这个问题

3 个答案:

答案 0 :(得分:1)

永远不要像字符串那样传递DATE或TIMESTAMP值。

使用PreparedStatement并传递java.sql.Datejava.sql.Timestamp

的实例
PreparedStatement pstmt = conn.prepareStatement(
    "SELECT * FROM Bill WHERE B_DATE BETWEEN ? and ?");

pstmt.setDate(1,new java.sql.Date(chooser.getDate().getTime()));
pstmt.setDate(2,new java.sql.Date(chooser1.getDate().getTime()));

ResultSet rs = st.executeQuery();
while (rs.next()) {
   ....
}

这样您就不必担心格式化日期或时间戳值。

由于Oracle DATE实际上是一个时间戳,因此最好使用时间戳值。

答案 1 :(得分:0)

来自dba-oracle.com

  

ORA-01861:文字与格式字符串

不匹配      

原因:输入中的文字必须与文字中的文字长度相同   格式字符串(前导空格除外)。如果   " FX"修改器已经切换,文字必须完全匹配,   没有额外的空白。
  操作:更正格式字符串以匹配文字。

所以你得到这个错误,因为你的日期格式不正确,我建议使用[TO_DATE] [3]:

"SELECT * FROM Bill WHERE B_DATE BETWEEN "
+ "TO_DATE('" + new SimpleDateFormat("dd-MM-yyyy").format(new java.sql.Date(chooser.getDate().getTime())) + "')"
+ "AND "
+ "TO_DATE('" + new SimpleDateFormat("dd-MM-yyyy").format(new java.sql.Date(chooser1.getDate().getTime())) + "')"

您还必须使用PreparedStatement来设置值,例如:

try (PreparedStatement stm = connection.prepareStatement(
        "SELECT * FROM Bill WHERE B_DATE BETWEEN TO_DATE(?, 'dd-mm-yyyy') and TO_DATE(?, 'dd-mm-yyyy')")) {

    stm.setString(1, new SimpleDateFormat("dd-MM-yyyy").format(new java.sql.Date(chooser.getDate().getTime())));
    stm.setString(2, new SimpleDateFormat("dd-MM-yyyy").format(new java.sql.Date(chooser1.getDate().getTime())));

    stm.execute();
}

答案 2 :(得分:0)

每当要插入日期时,都需要在PrepareStatement类的帮助下将其插入,因为它具有内置功能,可以将java.util.date(带有名称和数字的整个时间戳)转换为->将其转换为java。 sql.Date(格式为2018-09-06),然后将此sql日期用作ps.setDate(格式为:1996年1月9日),这是Oracle可以接受的。

注意:在将使用日期转换为sql日期通过时间而不是整个日期时。