LocalDateTime 및 SQL Server JDBC 4.2 드라이버

르지 :

나는 새로운 사용하려고 해요 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


https://docs.microsoft.com/en-us/sql/connect/jdbc/jdbc-4-2-compliance-for-the-jdbc-driver?view=sql-server-2017

어떻게 하단에있는 테이블에이 문장을 해석하는 방법 :

자바 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시"입니다.

대신를 검색해야합니다 TimestampUTC로 다음으로 변환 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".

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=78814&siteId=1