为什么用java.sql.Date和PreparedStatement会得到错误的结果?

时间:2018-09-17 15:16:12

标签: java sql calendar timezone prepared-statement

我要执行一个添加了日期的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);
        }
    }

我的问题是:如何从查询中删除时区?

0 个答案:

没有答案