gpt4 book ai didi

Java ora-01830 日期格式图片在转换整个输入字符串时间戳 SQL 之前结束

转载 作者:行者123 更新时间:2023-12-01 07:01:05 26 4
gpt4 key购买 nike

我在通过 java 使用 Oracle 时从数据库获取日期时遇到问题。如果我在 Java 中使用它:

SELECT * 
from HA2_BOOKINGS
WHERE ROOM like 'R1'
AND BEGINNING >= (TO_TIMESTAMP('2018-06-11 15:11:43.208', 'YYYY-MM-DD HH24:MI:SSXFF'))
AND END <= (TO_TIMESTAMP('2018-06-11 15:11:43.208', 'YYYY-MM-DD HH24:MI:SSXFF'))

我收到 ora-01830 错误,但是当我在 oracle 本身中使用完全相同的东西时,代码可以工作。有谁知道为什么吗?

我的java代码:

public Collection<Booking> getAllBookingsForRoomInPeriod(Room r, String startDate, String endDate) {
Collection<Booking> bookingsForRoomInPeriod = new ArrayList<Booking>();
SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd HH:mm");
parser.setLenient(false);

Date dateBeginning = new Date();
Date dateEnd = new Date();
try {
dateBeginning = parser.parse(startDate);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
dateEnd = parser.parse(endDate);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

Timestamp tsBeginning = new Timestamp(dateBeginning.getTime());
Timestamp tsEnd = new Timestamp(dateEnd.getTime());

bookingList.clear();

Connection aCon = Persistence.getConnection();
ResultSet resultSet = null;

// Raeume lesen
try {
resultSet = Persistence.executeQueryStatement(aCon, "SELECT * from HA2_BOOKINGS WHERE ROOM like '" + r.getRoomNr() + "' AND BEGINNING >= (TO_TIMESTAMP('" + tsBeginning + "', 'YYYY-MM-DD HH24:MI')) AND END <= (TO_TIMESTAMP('" + tsEnd + "', 'YYYY-MM-DD HH24:MI'))");
while (resultSet.next()) {
Booking a = new Booking();
a.setRoom(resultSet.getString("ROOM"));
a.setUsername(resultSet.getString("USERNAME"));
a.setDescription(resultSet.getString("DESCRIPTION"));
a.setBeginning(resultSet.getTimestamp("BEGINNING"));
a.setEnd(resultSet.getTimestamp("END"));
this.bookingList.add(a);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
Persistence.closeConnection(aCon);
}
System.out.println(bookingList);

return bookingList;
}

最佳答案

不要不要传递这样的参数。

"' AND BEGINNING >= (TO_TIMESTAMP('"+ tsBeginning + "', 'YYYY-MM-DD HH24:MI')) 将使用 Java 的 toString() 方法确实将 Timestamp 实例转换为字符串 - 这很可能与您指定的格式掩码不匹配。

使用占位符并直接传递 Timestamp 实例:

首先,您需要一个使用占位符 ? 而不是直接使用值的 SQL 查询:

String sql = "SELECT * from HA2_BOOKINGS WHERE ROOM = ? AND BEGINNING >= ? and END <= ?"

然后准备声明:

PreparedStatement pstmt = aCon.prepareStatement(sql);

或者在不使用变量的情况下使用它:

PreparedStatement pstmt = aCon.prepareStatement("SELECT * from HA2_BOOKINGS WHERE ROOM = ? AND BEGINNING >= ? and END <= ?");

提供值:

pstmt.setString(1, 'R1');
pstmt.setTimestamp(2, tsBeginning);
pstmt.setTimestamp(3, tsEnd);

执行查询(使用提供的值)并处理结果集。

resultSet = pstmt.executeQuery();
while (resultSet.next()) {
..
}

除了性能改进(因为您避免了 Oracle 中昂贵的硬解析)之外,这也是一种安全的方法,因为它可以防止 SQL 注入(inject)。

请注意,我用 = 替换了无用的 LIKE 运算符,因为 LIKE 'R1'= 'R1' 相同.

关于Java ora-01830 日期格式图片在转换整个输入字符串时间戳 SQL 之前结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50799374/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com