0

目标

我有一个非常奇怪的问题。我的目标是使用 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>

我不明白怎么可能有不同的日期,因为它们通常是相同的!任何线索来理解问题以及如何解决它?

4

2 回答 2

4

Oracle Date 类型没有毫秒的分辨率,它只有秒的分辨率。
将时间保存到数据库时,毫秒会被简单地剥离。当您查看实际值时,您会看到最后三位数字全为零。

于 2013-01-15T15:28:48.217 回答
3

假设它today是 a java.util.Date,JavaDate具有毫秒精度。另一方面, Oracledate没有毫秒精度。java.util.Date因此,当您将 a 存储在 Oracle 中并将其取回时,您会期望失去一些精度。

您可以将数据存储在 Oracletimestamp列中——该列将具有毫秒精度。Date或者您可以在将其写入数据库之前从 Java 中剥离毫秒。

于 2013-01-15T15:30:58.177 回答