我要执行一个添加了日期的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);
}
}
我的问题是:如何从查询中删除时区?