【问题标题】:PreparedStatement sets java.util.Date and java.sql.Date without Time information into Mysql dateTime columnPreparedStatement 将没有时间信息的 java.util.Date 和 java.sql.Date 设置为 Mysql dateTime 列
【发布时间】:2012-10-06 18:29:31
【问题描述】:

为什么 dateTime mysql 列上的 java.sql.PreparedStatement#setDate 总是导致日期格式像 2012-10-16 00:00:00 而没有时间信息?我将日期存储在这样的循环中:

protected Date getIncrementedDateTime() {
    additionalTime += 1000;
    return new Date(System.currentTimeMillis() + additionalTime);
}


preparedStatement.setDate(j, new java.sql.Date(getIncrementedDateTime().getTime());

我调试了这些值,但是 mysql 数据库总是有 2012-10-16 00:00:00 的值。

【问题讨论】:

    标签: java mysql


    【解决方案1】:

    它基于表列的数据类型。尝试根据数据库服务器使用TimeStampTime

    【讨论】:

      【解决方案2】:

      java.sql.Date 只是一个日期——没有时间。不要将它与包含时间信息的 java.util.Date 混淆。您可能想查看 java.sql.Timestamp。

      【讨论】:

        【解决方案3】:

        根据java.sql.Date 的文档:

        一个毫秒值的瘦包装器,允许 JDBC 将其识别为 SQL DATE 值。 [...]

        为了符合 SQL DATE 的定义,由 java.sql.Date 实例包装的毫秒值必须通过在特定时区中将小时、分钟、秒和毫秒设置为零来进行“规范化”。实例已关联。

        基本上,对于日期时间列,您可能应该使用不同的类型,例如Timestamp。 (这在其他方面并不理想,但它可能更适合......)

        【讨论】:

        • 时间戳不与“日期时间”列类型一起使用吗?不正确的日期时间值:列的“16:16:51”...所以我需要使用“timeStamp”列类型和时间戳数据类型?
        • @Sloin:我怀疑 Timestamp 实际上可以很好地处理日期时间列。此处基本上是 JDBC 中的一个省略,但Timestamp 可能是尽可能接近了。
        • 你说得对,java.sql.Timestamp 和 ps.setTimestamp(j, (Timestamp) value);适用于“日期时间”列类型
        • @Sloin Timestamp 应该可以正常工作。尝试这样做:preparedStatement.setDate(j, new java.sql.Timestamp(getIncrementedDateTime().getTime());
        猜你喜欢
        • 1970-01-01
        • 2011-08-29
        • 2016-02-14
        • 2015-08-09
        • 1970-01-01
        • 2020-01-04
        • 1970-01-01
        • 2016-07-13
        • 2012-08-21
        相关资源
        最近更新 更多