我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
,.002
as.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文档:
注意:此类型是a
java.util.Date
和单独的纳秒值的组合。仅整数秒存储在java.util.Date
组件中。分数秒-纳米-是分开的
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句