【问题标题】:Time is getting lost while casting to java.sql.Timestamp转换为 java.sql.Timestamp 时时间丢失
【发布时间】:2015-12-07 16:53:43
【问题描述】:

我正在访问数据库并使用 Spring 的 jdbcTemplate 获取表数据,它为我提供了每个记录的 Map 列表,如下所示:

List<Map<String, Object>> tableDataMap = this.jdbcTemplate.queryForList(this.sql, new Object[] { isModel }); 

现在,如果我看到 LST_UPDTD_TIME 列值的第一个映射是:-

LST_UPDTD_TIME=2015-09-08 11:24:45.0

但如果我尝试将它从 Object 转换为 java.sql.Timestamp,如下所示:-

(java.sql.Timestamp) mapRow.get("LST_UPDTD_TIME")

我得到的输出是:-

2015-09-08 00:00:00.0

谁能告诉我为什么从 Object 转换为 java.sql.Timestamp 时时间会丢失以及如何解决这个问题。

如果我执行:System.out.println(mapRow.get("LST_UPDTD_TIME").getClass());

获取输出为:class java.sql.Timestamp

数据库中的列类型也是 TIMESTAMP(6)。

谢谢

【问题讨论】:

  • 如果 mapRow.get("LST_UPDTD_TIME").getClass() 打印什么?我遇到了一些类似的问题,我必须使用 new Date(x.getTime())。请记住,java.util.Date 包含日期和时间
  • 如果 mapRow.get("LST_UPDTD_TIME").getClass() 打印什么? --> java.sql.Timestamp 正在打印。
  • 您使用的是什么 RDBMS 和 JDBC 驱动程序?
  • 不是答案,但你见过joda-time吗?我在 Hibernate 中使用它,它看起来很方便。
  • 当我在RowMapper&lt;T&gt; 中调用resultSet.getDate("STARTTIME") 而不是resultSet.getTimestamp("STARTTIME") 时遇到了这个问题

标签: java spring jdbc casting


【解决方案1】:

原因是 java.sql.Date 的参与,它是 java.util.Date 的包装器,是 Timestamp 的兄弟。该 SQL Date 清除了时间部分,并且适用于 SQL DATE。

如果驱动程序认为产生一个java.sql.Date,那么数据库可能已经为该列定义了 DATE - 一个问题。不知何故,这不符合您的错误描述。

无论如何都要检查.getClass()

【讨论】:

  • System.out.println(mapRow.get("LST_UPDTD_TIME").getClass()); --> 类 java.sql.Timestamp
  • 列在oracle数据库中也被定义为时间戳。
  • 你用 java.sql.Date 插入值了吗?
  • 不,我在插入查询中调用了oracle的SYSDATE函数来更新这个字段。
  • 数据库数据很好(?),虽然我会考虑SYSTIMESTAMP
猜你喜欢
  • 2013-11-14
  • 2012-10-26
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 2018-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多