我从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
请帮我解决这个问题
永远不要像字符串那样传递DATE或TIMESTAMP值。
使用PreparedStatement
并传递java.sql.Date
或java.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
实际上是一个时间戳,因此最好使用时间戳值。
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();
}
无论何时你想在PrepareStatement类的帮助下插入日期,因为它有内置函数来转换java.util.date(带有名称和数字的整个时间戳)---->将其转换为java.sql.Date (2018-09-06格式)然后使用这个sql date将preparedStatement作为ps.setDate(格式将成为:09-jan-1996),这是oracle可以接受的。
注意:将util日期转换为sql日期时,不是整个日期。