繁体   English   中英

在Java中以毫秒精度将Instant datetime插入MySql数据库

[英]Insert Instant datetime into MySql database with millisecond precision in java

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

我的数据库中的表是:

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

我已经在堆栈中搜索了这么多问题和答案,但似乎没有一个对我有用。

更新1:

我尝试使用setObject作为:

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

但结果仍然相同。 无法检索数据库中的毫秒数。

MySQL具有FROM_UNIXTIME()函数,该函数可以在内部获取long值并以'YYYY-MM-DD hh:mm:ss'或'YYYYMMDDhhmmss.uuuuuu'格式返回unix_timestamp的表示。 在这里参考他们的手册: FROM_UNIXTIME()

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

FROM_UNIXTIME(instant.toEpochMilli()* 0.001)

在我的插入声明中。

是的,无需在数据库中更改任何内容。 被唯一改变的是Java代码的setObject()用于函数preparedStatement ,路过instant.toEpochMilli()作为参数有最后使用的FROM_UNIXTIME() insert语句里面的功能。

我的最终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());
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM