gpt4 book ai didi

java - 数据库时间戳不匹配

转载 作者:行者123 更新时间:2023-12-01 19:01:40 31 4
gpt4 key购买 nike

我在 struts2 中有一个操作,它将查询数据库中的对象,然后通过一些更改来复制它。然后,它需要从副本中检索新的 objectID 并创建一个名为 objectID.txt 的文件。

以下是相关代码:

Action 类:

ObjectVO objectVOcopy = objectService.searchObjects(objectId);
//Set the ID to 0 so a new row is added, instead of the current one being updated
objectVOcopy.setObjectId(0);
Date today = new Date();
Timestamp currentTime = new Timestamp(today.getTime());
objectVOcopy.setTimeStamp(currentTime);
//Add copy to database
objectService.addObject(objectVOcopy);
//Get the copy object's ID from the database
int newObjectId = objectService.findObjectId(currentTime);
File inboxFile = new File(parentDirectory.getParent()+"\\folder1\\folder2\\"+newObjectId+".txt");

对象DAO

//Retrieve identifying ID of copy object from database
List<ObjectVO> object = getHibernateTemplate().find("from ObjectVO where timeStamp = ?", currentTime);
return object.get(0).getObjectId();

问题是,ObjectDAO 搜索方法通常不会返回任何内容。调试时,我注意到传递给它的时间戳 currentTime 通常与数据库中的值相差约 1-2 毫秒。我已经解决了这个错误,更改了 hibernate 查询以搜索时间戳在经过的 3 毫秒内的对象,但我不确定这种差异来自哪里。我不会重新计算 currentTime;我使用与写入数据库相同的方法从数据库中检索。我还担心当我将其部署到另一台服务器时,差异可能会更大。除了 objectID 之外,这是唯一的唯一标识符,因此我需要使用它来获取复制对象。

有谁知道为什么会发生这种情况,是否有比仅仅搜索范围更好的解决方法?顺便说一句,我正在使用 Microsoft SQL Server 2008 R2。

谢谢。

最佳答案

SQL Server 的 DATETIME 数据类型的精度与用其他语言生成的精度不完全匹配。 SQL Server 四舍五入到最接近的 0.003 - 这就是为什么您可以说:

DECLARE @d DATETIME = '20120821 23:59:59.997';
SELECT @d;

结果:

2012-08-21 23:59:59.997

然后尝试:

DECLARE @d DATETIME = '20120821 23:59:59.999';
SELECT @d;

结果:

2012-08-22 00:00:00.000

由于您使用的是 SQL Server 2008 R2,因此应确保使用 DATETIME2 数据类型而不是 DATETIME。

也就是说,@RedFilter 提出了一个很好的观点 - 当您可以使用生成的 ID 时,为什么还要依赖时间戳?

关于java - 数据库时间戳不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12058779/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com