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>

問題

理由はわかりませんが、アサートに失敗しました! 2 つの日付を比較すると、数ミリ秒の違いがあります。エラーは次のようなものです:

java.lang.AssertionError: expected:<1358262234801> but was:<1358262234000>

通常は同じであるため、どのようにして異なる日付を設定できるのかわかりません。問題とその解決方法を理解する手がかりはありますか?

4

2 に答える 2

4

The Oracle Date type doesn't have a resolution of milliseconds, it only has a resolution of seconds.
When saving a time to the database the milliseconds are simply stripped off. When you look at the actual value you see that the last three digits are all zero.

于 2013-01-15T15:28:48.217 に答える
3

が であると仮定するとtodayjava.util.DateJava のDate精度はミリ秒です。date一方、Oracleにはミリ秒の精度がありません。java.util.Dateそのため、aを Oracle に格納して戻すと、精度がいくらか失われることが予想されます。

timestampミリ秒の精度を持つOracle 列にデータを格納できます。Dateまたは、データベースに書き込む前にJava からミリ秒を削除することもできます。

于 2013-01-15T15:30:58.177 に答える