Insertar fecha y hora instantáneo en base de datos MySQL con una precisión de milisegundos en Java

Ujjwal Jung Thapa:

Estoy utilizando mysql 5.7.xla versión. También estoy usando java 8. Estoy tratando de insertar java.time.instantfecha 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.

Ujjwal Jung Thapa:

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

Supongo que te gusta

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