我在MS SQL数据库中使用DATETIME
来存储日期和时间。
Java to Database:preparedStatement.setTimestamp(2, insertObj.getTimestamp());
数据库到Java:selectedObj.setTimestamp(result.getTimestamp("datetime"));
在我的单元测试中将它们与insertObj.timestamp.equals(selectedObj.timestamp);
进行比较,随机返回true或false。
这是一个已知问题,我该如何解决这个问题?
答案 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
组件中。分数秒 - 纳米 - 是分开的