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

标签 java sql-server datetime jdbc timestamp

我在我的 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 the java.util.Date component. The fractional seconds - the nanos - are separate

关于java - 如果时间戳映射到数据库/从数据库映射,则 Timestamp#equals() 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41774428/

相关文章:

java - 这是通过 HTTP POST 向 java Web 服务器提交 JSON 的正确方法吗?

java - 在什么情况下选择 Katalon 而不是 Selenium?

java - 在 voltdb 中插入值列表

sql-server - Nodejs API 批量发布,正文中包含 JSON 数据

sql - 如何比较日期(月/年)与另一个日期(月/年)

java - 如何获取 Java 中所有窗口句柄的列表(使用 JNA)?

c# - Asp.net C# sql server 读取 block 中的二进制sql字段数据

sql - 查询 SQL Server 2012 数据库时出现初始错误

php - 根据存储在 mysql 数据库中的 unix 时间戳检查月份名称(使用 php)

python - 从日期时间列表中提取天、小时和秒