Estoy utilizando mysql 5.7.x
la versión. También estoy usando java 8. Estoy tratando de insertar java.time.instant
fecha y hora actual en una precisión de milisegundos en mi base de datos MySQL desde el código de Java. Para que estoy usando preparedstatement
.
La tabla en mi base de datos es:
CREATE TABLE `test_table` (
`id` INT NOT NULL AUTO_INCREMENT,
`timestamp` TIMESTAMP(3) NOT NULL,
PRIMARY KEY (`id`));
Mi código Java para inserción es:
Instant instant = Instant.now().truncatedTo(ChronoUnit.MILLIS);
try (Connection conn = DbConnection.getCon();
PreparedStatement ps = conn.prepareStatement("INSERT INTO test_table (timestamp) VALUES (?)");) {
ps.setTimestamp(1, Timestamp.from(instant));
ps.executeUpdate();
LOG.info("Instant: {} and long: {}", instant, instant.toEpochMilli());
} catch (SQLException ex) {
LOG.error(ex.getMessage());
}
Desde mi registro, puedo ver al instante con milliesecond como: 2019-07-30T10: 52: 34.865Z. Pero en mi base de datos MySQL se convierte en: 30/07/2019 10: 52: 34.000Z
He buscado tantas preguntas y respuestas en la pila pero ninguno parece funcionar para mí.
Actualización 1:
He intentado utilizar setObject como:
ps.setObject(1, Timestamp.from(instant));
Pero aún así mismo resultado. No se pueden recuperar los milisegundos en la base de datos.
MySQL tiene FROM_UNIXTIME()
función que puede tomar valores largos dentro y devuelve una representación de la UNIX_TIMESTAMP en 'hh AAAA-MM-DD: mm: ss' o formato 'YYYYMMDDhhmmss.uuuuuu'. Referencia de su manual de aquí: FROM_UNIXTIME ()
Ya que tengo milisegundos desde la época, por lo tanto tengo que usar
FROM_UNIXTIME (instant.toEpochMilli () * 0.001)
en mi instrucción de inserción.
Si nada hay que cambiar la base de datos. Las únicas cosas que se cambian están en el código de Java que son setObject()
función que se utiliza para preparedStatement
, pasando instant.toEpochMilli()
como argumento allí y, finalmente, la utilización de FROM_UNIXTIME()
la función dentro de instrucción de inserción.
Mi código java final parece algo como esto:
Instant instant = Instant.now().truncatedTo(ChronoUnit.MILLIS);
try (Connection conn = DbConnection.getCon();
PreparedStatement ps = conn.prepareStatement("INSERT INTO test_table (timestamp) VALUES (FROM_UNIXTIME(?*0.001))");) {
ps.setObject(1, instant.toEpochMilli());
ps.executeUpdate();
LOG.info("Instant: {} and long: {}", instant, instant.toEpochMilli());
} catch (SQLException ex) {
LOG.error(ex.getMessage());
}