Почему я получаю неправильный результат с java.sql.Date и PreparedStatement? - PullRequest
0 голосов
/ 17 сентября 2018

Я хочу выполнить 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);
        }
    }

Мой вопрос: как удалить часовой пояс из запроса?

...