2016-12-13 1 views
0

Я использую Spring JDBC для хранения объекта classifiedAd в моей базе данных MariaDB следующим образом:Spring JDBC MySQL/MariaDB данных усечена для столбца «датой_начала» в строке 1

public void insert(ClassifiedAd classifiedAd){ 

    this.jdbcTemplate.update(new PreparedStatementCreator(){ 

     @Override 
     public PreparedStatement createPreparedStatement(Connection connection) throws SQLException { 

      PreparedStatement ps = connection.prepareStatement(INSERT_SQL, Statement.RETURN_GENERATED_KEYS); 
      ... 
      ps.setTimestamp(6, new Timestamp(classifiedAd.getStartDate().getTimeInMillis())); 
      ... 
      return ps; 
     } 
    }, keyHolder); 

Объект classifiedAd имеет поле private Calendar startDate что я конвертирую в java.sql.Timestamp, прежде чем сопоставлять его с соответствующим столбцом start_date datetime null, в базе данных.

Но при установке я получаю следующее предупреждение:

Dec 13, 2016 10:59:10 AM com.mchange.v2.c3p0.SQLWarnings logAndClearWarnings 
INFO: Data truncated for column 'start_date' at row 1 
java.sql.SQLWarning: Data truncated for column 'start_date' at row 1 
    at org.mariadb.jdbc.MariaDbConnection.getWarnings(MariaDbConnection.java:833) 
    at com.mchange.v2.c3p0.impl.NewProxyConnection.getWarnings(NewProxyConnection.java:907) 
    at com.mchange.v2.c3p0.SQLWarnings.logAndClearWarnings(SQLWarnings.java:42) 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.refurbishResourceOnCheckin(C3P0PooledConnectionPool.java:285) 
    at com.mchange.v2.resourcepool.BasicResourcePool.attemptRefurbishResourceOnCheckin(BasicResourcePool.java:1606) 
    at com.mchange.v2.resourcepool.BasicResourcePool.access$200(BasicResourcePool.java:32) 
    at com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask.run(BasicResourcePool.java:1228) 
    at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547) 

Я действительно не понимаю, почему метка времени усечен, так как это указано here, что это правильный тип использовать. Любая помощь, пожалуйста?

РЕДАКТИРОВАТЬ

Эти значения, которые я получаю до и после вставки:

Начальное значение:

System.out.println(BankCardDAOTest.expiration_date.get(Calendar.DAY_OF_MONTH) + "/" 
    + (classifiedAd.getStartDate.get(Calendar.MONTH) + 1) + "/" 
    + classifiedAd.getStartDate.get(Calendar.YEAR) + " " 
    + classifiedAd.getStartDate.get(Calendar.HOUR) + ":" 
    + classifiedAd.getStartDate.get(Calendar.MINUTE) + ":" 
    + classifiedAd.getStartDate.get(Calendar.SECOND)); 

====> 27/7/2016 4:3:54 

После вставки и извлечения объекта:

dao.insert(classifiedAd); 
classifiedAd = dao.select(classifiedAd.getId()); 

====> 27/7/2016 0:0:0 

Любая помощь, пожалуйста?

+0

Единственным, что я могу думать, что это дата выпуска в формате ... как хранятся даты на ваших таблицах mariadb ... можете ли вы опубликовать результат выражения select для этого поля? – Hackerman

+0

Включите общий журнал на сервере MariaDB, запустите свой код, вы сразу увидите, что он отправляет, и почему выдается предупреждение. – elenst

ответ

0

DATEs должно быть образовано 2016-12-31.
DATETIME и TIMESTAMP значения должны быть образованы 2016-12-31 23:59:59.

Другие форматы могут вызвать сообщение об ошибке, которое вы получили.

+0

Как я могу это сделать? – karim

+0

Откуда берутся строки даты? На что они похожи? –

0

К сожалению я моя база базы данных была сгенерирована с date столбцами вместо datetime я исправленного, что теперь он работает отлично ...

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