我有一个非常奇怪的问题。我的目标是使用dbunit比较数据库中的动态日期(数据库是Oracle数据库)。此动态日期是今天的日期(比较静态日期工作......)
为了比较日期,我使用这个非常简单的代码:
@Test
public void simpleDateTest() throws DatabaseUnitException, SQLException {
// create a date corresponding to today
Date today = new Date();
// load a dataset
IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(getClass()
.getResource("/dataset.xml"));
// replace [TODAY] by the today date
ReplacementDataSet rDataSet = new ReplacementDataSet(expectedDataSet);
rDataSet.addReplacementObject("[TODAY]", today);
// insert the dataset
DatabaseConnection connection = getConnection();
DatabaseOperation.CLEAN_INSERT.execute(connection, rDataSet);
// do a simple query to get some fields, em is the entity manager which uses the same connection as above
Query q = em
.createNativeQuery("SELECT ID, MY_DATE FROM MY_TABLE");
List<Object[]> result = q.getResultList();
// compare the date with today date
assertEquals(today.getTime(), ((Date) result.get(0)[1]).getTime());
}
使用以下数据集:
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
<MY_TABLE ID="1" MY_DATE="[TODAY]" />
</dataset>
我不知道为什么,但断言失败了!比较两个日期时,差异很小。错误是这样的:
java.lang.AssertionError: expected:<1358262234801> but was:<1358262234000>
我不明白怎么可能有不同的日期,因为它们通常是相同的! 任何了解问题以及如何解决问题的线索?
答案 0 :(得分:4)
Oracle Date类型的分辨率不是毫秒,它只有秒的分辨率 将时间保存到数据库时,只需删除毫秒。当您查看实际值时,您会看到最后三位数都为零。
答案 1 :(得分:3)
假设today
是java.util.Date
,Java Date
具有毫秒精度。另一方面,Oracle date
没有毫秒精度。因此,当您在Oracle中存储java.util.Date
并将其检索回来时,您可能会失去一些精确度。
您可以将数据存储在Oracle timestamp
列中,该列具有毫秒级的精度。或者,您可以在将Java Date
写入数据库之前从其中删除毫秒数。