-
Notifications
You must be signed in to change notification settings - Fork 441
Closed
Description
Driver version or jar name
mssql-jdbc-6.1.6.jre7.jar
SQL Server version
SQL Server 2016
Client operating system
Windows 7 Enterprise (64bit)
Java/JVM version
java version "1.7.0_79"
Table schema
CREATE TABLE DATETIMETEST (
Id int,
UpdateDate datetime,
PRIMARY KEY (Id)
);
INSERT INTO DATETIMETEST VALUES(1, '2018-04-01 12:00:00.000');
INSERT INTO DATETIMETEST VALUES(2, '2018-04-01 12:00:01.003');
Problem description
On SQL Server 2016, selected datetime value doesn't match the original value.
It must be caused by the following change.
https://support.microsoft.com/en-us/help/4010261/sql-server-and-azure-sql-database-improvements-in-handling-some-data-t
But the problem doesn't occur in .NET.
Is it a problem of the JDBC driver?
Expected behavior and actual behavior
Expected: it matches.
Actual: it doesn't match.
Repro code
Connection conn = ...;
for (int i = 1; i <= 2; i++) {
PreparedStatement statement1 = conn.prepareStatement("SELECT UpdateDate FROM DATETIMETEST WHERE ID=?");
statement1.setInt(1, i);
ResultSet resultSet1 = statement1.executeQuery();
resultSet1.next();
Timestamp date1 = resultSet1.getTimestamp(1);
resultSet1.close();
statement1.close();
PreparedStatement statement2 = conn.prepareStatement("SELECT COUNT(*) FROM DATETIMETEST WHERE ID=? AND UpdateDate=?");
statement2.setInt(1, i);
statement2.setTimestamp(2, date1);
ResultSet resultSet2 = statement2.executeQuery();
resultSet2.next();
// When Id=1, count=1
// When Id=2, count=1 (SQL Server 2012) / count=0 (SQL Server 2016)
System.out.println("Id=" + i + ", UpdateDate=" + date1 + ", count=" + resultSet2.getInt(1));
resultSet2.close();
statement2.close();
}
Metadata
Metadata
Assignees
Labels
No labels