2016-08-02 5 views
0

Mybatis вставки java.util.Date к MySQL DATETIME колонки, а затем извлечь его находят, что они не соответствуютПочему mybatis вставляет значение java.util.Date в столбец datetime Mysql, а затем извлекать его, они не равны?

Таблица

CREATE TABLE `t` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`create_time` datetime DEFAULT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 

код

@Insert("insert into t(create_time) values(#{0})") 
int insertT(Date date); 
@Select("select create_time from t order by id desc limit 1") 
Date getLatestCreateTime(); 

тест Блок

Date date1 = new Date(); 
    mapper.insertT(date1); 

    Date date2 = mapper.getLatestCreateTime(); 

    Assert.assertEquals(date1, date2); 

Assert fail

java.lang.AssertionError: 
Expected :Tue Aug 02 22:10:35 CST 2016 
Actual :Tue Aug 02 22:10:36 CST 2016 

Почему так?

ответ

0

, потому что, когда TimeUtil в mysql-connector преобразования Timstamp на сегодняшний день, он выполняет ниже код

Timestamp ts = new Timestamp(tsAsMillis1 + (long)offsetDiff); 
    ts.setNanos(secondsPart); 

и secondsPart является 0.

@Test 
public void test_date_compare_date_from_timestamp() { 
    Date date1 = new Date(); 

    Timestamp ts = new Timestamp(date1.getTime()); 
    System.out.println(ts); // 2016-08-08 22:37:37.078 
    Date date2 = new Date(ts.getTime()); 
    Assert.assertEquals(date1, date2); 
    ts.setNanos(0); 
    System.out.println(ts); // 2016-08-08 22:37:37.0 
    Date date3 = new Date(ts.getTime()); 
    Assert.assertNotEquals(date1, date3); 
} 

и в течение секунды более оригинальные секунд, это поскольку

insert into t select 1,'2016-08-08 22:42:44.676'; 
select * from t; 
+----+---------------------+ 
| id | create_time   | 
+----+---------------------+ 
| 1 | 2016-08-08 22:42:45 | 
+----+---------------------+ 

 Смежные вопросы

  • Нет связанных вопросов^_^