有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在使用PreparedStatement读取“smalldatetime”列时返回额外的“.0”

我在SQL Server中有一个列类型为smalldatetime的表,我正在使用PreparedStatement读取/写入表中的数据。我的桌子是这样的:

|         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

为什么会这样


共 (1) 个答案

  1. # 1 楼答案

    底层的SQL ServerJDBC驱动程序首先将返回的字节转换为GregorianCalendar,然后基于此GregorianCalendar对新创建的Timestamp调用toString。这会导致后面的.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