我在我的 MS SQL 数据库中使用 DATETIME
来存储日期和时间。
Java 到数据库:preparedStatement.setTimestamp(2, insertObj.getTimestamp());
数据库到 Java:selectedObj.setTimestamp(result.getTimestamp("datetime"));
在我的单元测试中将它们与 insertObj.timestamp.equals(selectedObj.timestamp);
进行比较,随机返回 true 或 false。
这是一个已知问题吗?我该如何解决?
最佳答案
SQL Server DATETIME
具有 +/- 3 毫秒的精度:
Rounded to increments of .000, .003, or .007 seconds
换句话说,如果您插入一个小于 .001
的值,它将被存储为 .000
、.002
> 作为 .003
等,使此类值的相等检查失败。如果您在 Timestamp
中具有亚毫秒精度,您也可以产生这种效果(例如,存储 Timestamp
的亚秒值为 .0001
将四舍五入为 .000
),另见下文。
如果你想要更精确的存储,那么你需要使用DATETIME2
它具有 100 纳秒的精度,否则您需要考虑舍入,例如检查两个值之间的绝对差是否小于 3 毫秒,例如:
Math.abs(insertTimestamp.getTime() - selectedTimestamp.getTime()) < 3
请注意 java.sql.Timestamp
可以包含高达纳秒的精度(因此如果您在 DATETIME2
中存储分辨率高于 100ns 的值,您仍然可以有这个问题)。您通常具有毫秒精度,但如果使用 setNanos
明确设置,您可以获得纳秒级精度。 (用于设置亚秒纳秒值)或者如果是从 java.time
类之一创建的。另见 Timestamp API文档:
Note: This type is a composite of a
java.util.Date
and a separate nanoseconds value. Only integral seconds are stored in thejava.util.Date
component. The fractional seconds - the nanos - are separate
关于java - 如果时间戳映射到数据库/从数据库映射,则 Timestamp#equals() 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41774428/