在 java 中以毫秒精度将即时日期时间插入 MySql 数据库

Insert Instant datetime into MySql database with millisecond precision in java

我正在使用 mysql 5.7.x 版本。我也在使用 java 8。我正在尝试从 java 代码将 java.time.instant 以毫秒为单位的当前日期时间插入到我的 mysql 数据库中。为此,我正在使用 preparedstatement.

我数据库中的table是:

CREATE TABLE `test_table` (
`id` INT NOT NULL AUTO_INCREMENT,
`timestamp` TIMESTAMP(3) NOT NULL,
PRIMARY KEY (`id`));

我要插入的 java 代码是:

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

从我的日志中,我可以看到带毫秒的即时时间为:2019-07-30T10:52:34.865Z。 但是在我的 mysql 数据库中它变成了: 2019-07-30 10:52:34.000Z

我在堆栈中搜索了很多问题和答案,但 none 似乎对我有用。

更新 1:

我尝试将 setObject 用作​​:

ps.setObject(1, Timestamp.from(instant));

但还是一样的结果。无法检索数据库中的毫秒数。

MySQL 有 FROM_UNIXTIME() 函数,可以在内部取长值,returns 表示 'YYYY-MM-DD hh:mm:ss' 或 'YYYYMMDDhhmmss.uuuuuu' 中的 unix_timestamp格式。 从他们的手册中参考: FROM_UNIXTIME()

因为我从纪元开始有毫秒数,所以我必须使用

FROM_UNIXTIME(instant.toEpochMilli() * 0.001)

在我的插入语句中。

是的,数据库中无需更改任何内容。唯一改变的是 java 代码,它是用于 preparedStatementsetObject() 函数,传递 instant.toEpochMilli() 作为参数,最后使用 FROM_UNIXTIME() 函数在插入语句中。

我的最终 java 代码如下所示:

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