Я хочу выполнить PreparedStatement
с добавленной датой.Сначала я преобразовываю объект LocalDate
в объект java.sql.Date
, а затем добавляю его к PreparedStatement
.Проблема в том, что после установки даты с setDate(..)
в операторе также содержится часовой пояс.
Так что вместо:
Select rating from BookRating where date_added='2017-09-16'
я получаю
Select rating from BookRating where date_added='2017-09-16 +03'
И это не работает для меня, потому что все мои строки в таблице SQL содержат только саму датубез часового пояса.
Это мой код:
LocalDate date = ...;
try (Connection conn = ConnectionFactory.getConnection()) {
Date sqlDate = Date.valueOf(date);
PreparedStatement pstmt = null;
String SQL = "Select rating from BookRating where date_added=?";
pstmt = conn.prepareStatement(SQL);
pstmt.setDate(1, sqlDate);
try (ResultSet rs = pstmt.executeQuery()) {
if (rs.next()) {
//does not enter here, no result entry
}
}
} catch (URISyntaxException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
Это реализация метода setDate(..)
(взято из JDK).Фактически он использует Calendar
для добавления TimeZone
к запросу.
public void setDate(int i, Date d, Calendar cal) throws SQLException {
this.checkClosed();
if (d == null) {
this.setNull(i, 91);
} else if (this.connection.binaryTransferSend(1082)) {
byte[] val = new byte[4];
TimeZone tz = cal != null ? cal.getTimeZone() : null;
this.connection.getTimestampUtils().toBinDate(tz, val, d);
this.preparedParameters.setBinaryParameter(i, val, 1082);
} else {
if (cal == null) {
cal = this.getDefaultCalendar();
}
this.bindString(i, this.connection.getTimestampUtils().toString(cal, d), 0);
}
}
Мой вопрос: как удалить часовой пояс из запроса?