나는 새로운 사용하려고 해요 java.time
는 SQL Server JDBC 드라이버의 최신 버전으로 클래스를. 나는 읽으면서 그냥 방법으로 작동합니다 : PreparedStatement.setObject()
와 ResultSet.getObject()
.
그래서 샘플 코드를 생성하고,이 ResultSet를하지 일을 얻을 수 있습니다. 나는 여기에 잘못 뭘하는지 모르겠어요.
Connection connection = DriverManager.getConnection(connectionString);
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM myTable WHERE ? BETWEEN date_from AND date_to");
preparedStatement.setObject(1, LocalDateTime.now()); // That works
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
Object o = resultSet.getObject("date_from");
o.getClass() returns java.sql.Timestamp
LocalDateTime dateTime = resultSet.getObject("date_from", LocalDateTime.class);
}
이 예외가 발생합니다 :
com.microsoft.sqlserver.jdbc.SQLServerException : 클래스 java.time.LocalDateTime로 변환이 지원되지 않습니다.
드라이버 버전 : MSSQL-JDBC-6.5.4.jre8-preview.jar
SQL Server 버전 : 2016
어떻게 하단에있는 테이블에이 문장을 해석하는 방법 :
자바 8의 새로운 자바 클래스 : LOCALDATE / 로컬 시간 / LocalDateTime, OffsetTime / OffsetDateTime
새로운 JDBC 유형 : TIME_WITH_TIMEZONE, TIMESTAMP_WITH_TIMEZONE, REF_CURSOR
REF_CURSOR is not supported in SQL Server. Driver throws a SQLFeatureNotSupportedException exception if this type is used. The driver supports all other new Java and JDBC type mappings as specified in the JDBC 4.2 specification.
나는 여기에 잘못 뭘하는지 모르겠어요.
당신은 아무것도 잘못을하고 있지 않습니다. 당신은 이전에 SQL Server에 대한 마이크로 소프트의 JDBC 드라이버에서 결함을 발견 한 버전 7.1.0 논의, 여기 .
나중에 MSSQL-JDBC 버전 7.1.0 이상을 사용하는 경우에 당신은 사용할 수 있습니다 getObject(x, LocalDateTime.class)
예상대로.
다른 제안으로 MSSQL-JDBC 이전 버전을 7.1.0에 들어, 당신은 검색해야 Timestamp
하고로 변환 LocalDateTime
. 그러나, 단순한 솔루션이 알고 ...
LocalDateTime dateTime = resultSet.getTimestamp("date_from").toLocalDateTime()
... 손상됩니다 특정 날짜 / 시간 값은 JVM의 기본 시간대가 일광 절약 시간, 일명 "서머 타임"을 준수합니다. 예를 들어,
// time zone with Daylight Time
TimeZone.setDefault(TimeZone.getTimeZone("America/Edmonton"));
// test environment
Statement st = conn.createStatement();
st.execute("CREATE TABLE #tmp (id INT PRIMARY KEY, dt2 DATETIME2)");
st.execute("INSERT INTO #tmp (id, dt2) VALUES (1, '2018-03-11 02:00:00')");
ResultSet rs = st.executeQuery("SELECT dt2 FROM #tmp WHERE id=1");
rs.next();
// test code
LocalDateTime x = rs.getTimestamp("dt2").toLocalDateTime(); // bad
System.out.println(x.toString());
"2018-03-11T03을 : 00"을 인쇄합니다. 참고 시간이 없다 "2시" "3시"입니다.
대신를 검색해야합니다 Timestamp
UTC로 다음으로 변환 LocalDateTime
하여 시간대 성분을 제거, UTC에 대해
// time zone with Daylight Time
TimeZone.setDefault(TimeZone.getTimeZone("America/Edmonton"));
// test environment
Statement st = conn.createStatement();
st.execute("CREATE TABLE #tmp (id INT PRIMARY KEY, dt2 DATETIME2)");
st.execute("INSERT INTO #tmp (id, dt2) VALUES (1, '2018-03-11 02:00:00')");
ResultSet rs = st.executeQuery("SELECT dt2 FROM #tmp WHERE id=1");
rs.next();
// test code
Timestamp ts = getTimestamp("dt2", Calendar.getInstance(TimeZone.getTimeZone("UTC")));
LocalDateTime x = LocalDateTime.ofInstant(ts.toInstant(), ZoneId.of("UTC")); // good
System.out.println(x.toString());
이는 인쇄 "2018-03-11T02 : 00".