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

Java 如果时间戳映射到数据库或从数据库映射,则时间戳#equals()将失败,java,sql-server,datetime,jdbc,timestamp,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 这是一个已

我正在MS SQL数据库中使用
DATETIME
存储日期和时间

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

数据库到Java:
selectedObj.setTimestamp(result.getTimestamp(“datetime”)

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

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

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

四舍五入到.000、.003或.007秒的增量

换言之,如果插入一个分数为
.001
的值,它将被存储为
.000
.002
.003
,等等,这使得对这些值的等于检查失败。如果
时间戳
的精度为亚毫秒(例如,存储
时间戳
的亚秒值
.0001
将四舍五入为
.000
),则也会产生这种效果,另见下文

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

Math.abs(insertTimestamp.getTime() - selectedTimestamp.getTime()) < 3
Math.abs(insertTimestamp.getTime()-selectedTimestamp.getTime())<3
请注意,
java.sql.Timestamp
可以包含高达纳秒的精度(因此,如果您在
DATETIME2
中存储分辨率高于100ns的值,您仍然可能存在此问题)。您通常具有毫秒精度,但如果使用显式设置(用于设置亚秒纳秒值)或从
java.time
类之一创建,则可以获得纳秒精度。另请参见API文档:

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


因此,数据库列的类型是:,Java变量的类型是:?什么是JDBC驱动程序?@Basil Bourque是的,这就是向数据库中插入日期时间值的方式,JDBC中没有“setDatetime()”或任何其他内容,JDBC驱动程序将正确处理从时间戳到日期时间戳的转换,它在一段时间内工作,有时返回的时间戳与插入的时间戳正好相差1毫秒(A)你没有回答我的问题。(B) 我熟悉JDBC的工作原理。(C) 在您的问题中添加示例数据值。您的所有答案都可以在我的问题中找到:Microsoft SQL Server、DATETIME列、java.SQL.Timestamp、Microsoft JDBC 4.2精彩的解释,谢谢!还有一个问题:SQL中的时间数据类型是否具有类似的行为?我真的不需要这样的精度,我只需要得到与我存储的完全相同的值。@Pali,请参阅:“精度100纳秒(Informatica中为1毫秒)”,但是
java.sql.Time
只有秒精度,但您应该能够将
时间戳设置/获取到
时间
字段,但是你会丢失日期信息。