Return 使用 PreparedStatement 读取 "smalldatetime" 列时额外的“.0”

Return extra ".0" when reading "smalldatetime" column with PreparedStatement

我在 SQL Server 中有一个 table,列类型为 smalldatetime,我在 table 中使用 PreparedStatement 到 read/write 数据]s。例如我的 table 就像:

|         date           |
+------------------------+
|   2019-11-06 09:48:00  +
|   2019-11-05 07:04:00  +
|         ...            +
+------------------------+

我正在阅读 date 专栏:

String date = rs.getString("date");

我在日期结束时得到额外的 .0

2019-11-06 09:48:00.0
2019-11-05 07:04:00.0

为什么会这样?

底层SQL Server JDBC驱动首先将返回的字节转换为GregorianCalendar,然后根据此在新创建的Timestamp上调用toString GregorianCalendar。这会导致尾随 .0.

case CHARACTER: {
  ...many other conversions...
  switch (ssType) {
    case DATETIME: // and SMALLDATETIME
    {
      return (new java.sql.Timestamp(cal.getTimeInMillis())).toString();
    }

mssql-jdbc Conversion Code mssql-jdbc SMALLDATETIME handling

那么mssql-jdbc代码实际执行的是:

System.out.println(new java.sql.Timestamp(100).toString());

> 1970-01-01 00:00:00.1

JavaDoc Timestamp#toString