Inserir data e hora instantâneo no banco de dados MySql com precisão de milissegundos em java

Ujjwal Jung Thapa:

Eu estou usando mysql 5.7.xa versão. Também estou usando java 8. Eu estou tentando inserir java.time.instantdata 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.

Ujjwal Jung Thapa:

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());
    }

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=230903&siteId=1
Recomendado
Clasificación