Eu estou usando mysql 5.7.x
a versão. Também estou usando java 8. Eu estou tentando inserir java.time.instant
data e hora atual em precisão de milissegundos em meu banco de dados mysql a partir do código java. Por que eu estou usando preparedstatement
.
A tabela no meu banco de dados é:
CREATE TABLE `test_table` (
`id` INT NOT NULL AUTO_INCREMENT,
`timestamp` TIMESTAMP(3) NOT NULL,
PRIMARY KEY (`id`));
Meu código java para inserção é:
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());
}
Do meu log, eu posso ver instantânea com milliesecond como: 2019-07-30T10: 52: 34.865Z. Mas no meu banco de dados mysql, torna-se: 2019/07/30 10: 52: 34.000Z
Tenho pesquisado tantas perguntas e respostas na pilha, mas nenhum parece trabalhar para mim.
Update 1:
Eu tentei usar setObject como:
ps.setObject(1, Timestamp.from(instant));
Mas ainda mesmo resultado. Não é possível recuperar os milissegundos em banco de dados.
MySQL tem FROM_UNIXTIME()
função que pode tomar valores longos dentro e retorna uma representação do unix_timestamp em 'hh AAAA-MM-DD: mm: ss' ou formato 'YYYYMMDDhhmmss.uuuuuu'. Referência de seu manual de aqui: FROM_UNIXTIME ()
Desde que eu tenho milissegundos desde época, portanto, eu tenho que usar
FROM_UNIXTIME (instant.toEpochMilli () * 0,001)
na minha declaração de inserção.
Sim nada precisa ser alterado no banco de dados. As únicas coisas que são alteradas são em código java que são setObject()
função usada para preparedStatement
, passando instant.toEpochMilli()
como argumento lá e finalmente usar da FROM_UNIXTIME()
função dentro instrução de inserção.
Meu código java final, é algo como isto:
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());
}