【问题标题】:Return extra ".0" when reading "smalldatetime" column with PreparedStatement使用 PreparedStatement 读取“smalldatetime”列时返回额外的“.0”
【发布时间】:2020-03-02 15:54:59
【问题描述】:

我在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

为什么会这样?

【问题讨论】:

  • 那为什么不做getDate呢?然后,您可以将其格式化为您想要的任何格式。
  • 我试过了,getDate 只返回日期(例如 2019-11-06)而不是时间...
  • @yaylitzis 然后尝试使用ResultSet#getTimestamp(),最好在Java端使用LocalDateTime
  • 这看起来纯粹是一个格式化的东西;该值没有改变,只是没有按照 OP 的预期显示。

标签: java sql-server prepared-statement smalldatetime


【解决方案1】:

底层SQL Server JDBC 驱动程序首先将返回的字节转换为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

【讨论】:

  • 我不知道 mssql-jdbc 驱动程序是 MIT 许可并且在 github 上:-)
猜你喜欢
  • 2019-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
相关资源
最近更新 更多