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

帕里

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

Java到数据库: preparedStatement.setTimestamp(2, insertObj.getTimestamp());

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

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

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

马克·罗特·韦尔

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

四舍五入为.000,.003或.007秒

换句话说,如果您插入一个值的第二个小数部分.001,该值将被存储为.000.002as.003等等,从而使等值检查失败。如果您在中具有亚毫秒级的精度Timestamp(例如,存储Timestamp具有亚秒级值的.0001将舍入为.000),也可以具有此效果,另请参见下文。

如果需要更精确的存储,则需要使用DATETIME2精度为100纳秒的存储,否则需要考虑四舍五入,例如通过检查两个值之间的绝对差是否小于3毫秒,例如:

Math.abs(insertTimestamp.getTime() - selectedTimestamp.getTime()) < 3

请注意,java.sql.Timestamp它最多可以包含纳秒级的精度(因此,如果将分辨率高于100ns的值存储在中DATETIME2,则仍然会出现此问题)。通常,您具有毫秒级的精度,但是如果使用显式设置setNanos(用于设置亚秒级的纳秒值)或由其中一个java.time创建,则可以获得纳秒级的精度另请参阅Timestamp API文档:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章