Do not такие параметры передачи.
"' 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.
Обратите внимание, что я заменил бесполезный оператор LIKE
на =
, потому что LIKE 'R1'
совпадает с = 'R1'
.