如果时间戳映射到数据库/从数据库映射,则时间戳#equals()失败

时间:2017-01-21 00:21:25

标签: java sql-server datetime jdbc timestamp

我在MS SQL数据库中使用DATETIME来存储日期和时间。

Java to Database:preparedStatement.setTimestamp(2, insertObj.getTimestamp());

数据库到Java:selectedObj.setTimestamp(result.getTimestamp("datetime"));

在我的单元测试中将它们与insertObj.timestamp.equals(selectedObj.timestamp);进行比较,随机返回true或false。

这是一个已知问题,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

SQL Server DATETIME的准确度为+/- 3毫秒:

  

舍入为.000,.003或.007秒的增量

换句话说,如果您插入的值为次要分数.001,则会将其存储为.000,将.002存储为.003等,等于检查失败的这些值。如果您在Timestamp中具有亚毫秒精度,则也可以产生此效果(例如,存储具有亚秒值Timestamp的{​​{1}}将四舍五入为.0001 ),见下文。

如果您想要更精确的存储,那么您需要使用具有100纳秒精度的DATETIME2,否则您需要考虑舍入,例如通过检查两个值之间的绝对差异是否更小超过3毫秒,例如:

.000

请注意,Math.abs(insertTimestamp.getTime() - selectedTimestamp.getTime()) < 3 可以包含高达纳秒的精度(因此,如果您在java.sql.Timestamp中存储分辨率高于100ns的值,则仍然可能存在此问题)。您通常具有毫秒精度,但如果使用setNanos(用于设置亚秒秒纳秒值)显式设置或者从DATETIME2类之一创建,则可以获得纳秒精度。另请参阅Timestamp API文档:

  

注意:此类型是java.time和单独的纳秒值的组合。只有整数秒存储在java.util.Date组件中。分数秒 - 纳米 - 是分开的