【问题标题】:java.util.Date to java.sql.Date doesn't contain Timejava.util.Date 到 java.sql.Date 不包含时间
【发布时间】:2015-08-09 08:07:40
【问题描述】:

我在PreparedStatement 上收到SqlException,因为它违反了表上的唯一性约束(重复键)。基本上我的表是这样的:

mytable
=======
mytable_id        PRIMARY KEY INT NOT NULL
fizz_id           INT NOT NULL
buzz_timestamp    DATETIME

唯一性约束在buzz_timestamp上;也就是说,没有 2 条记录可能具有相同的日期/时间“时间戳”。

将记录插入此表的PreparedStatement 如下所示:

PreparedStatement ps = conn.prepareStatement(insertQuery);
ps.setDate(1, new java.sql.Date(new java.util.Date().getTime()));

所以你可以看到我正在使用 java.util.Date()(“现在”)并将其转换为 java.sql.Date 实例。

我看到的确切错误(dupe key)一直抱怨我试图将2015-05-27 00:00:00.0000000 插入到buzz_timestamp 的表中,但它已经存在。因此,很明显,我使用了错误的 Date API,并且我插入了具有无效时间组件的日期,从而产生了重复密钥异常。

所以我问:我该如何纠正这个问题,以便我真正为“现在”插入日期和时间?

【问题讨论】:

标签: java sql-server date timestamp sqlexception


【解决方案1】:

使用

ps.setTimestamp(new java.sql.Timestamp(System.currentTimeMillis());

看到这个:Using setDate in PreparedStatement

【讨论】:

    【解决方案2】:

    java.sql.Date 扩展 java.util.Date 但工作方式不同:在 SQL 中,DATE 没有时间。因此,Java 对象也会忽略小时、分钟等。

    改用java.sql.Timestamp,但您可能需要强制转换(在SQL 中)将其转换为DATETIME

    相关:

    【讨论】:

      【解决方案3】:

      你需要尝试 setTimestamp 而不是 setDate

      java.sql.Date - A date only (no time part)
      java.sql.Time - A time only (no date part)
      java.sql.Timestamp - Both date and time
      

      【讨论】:

        【解决方案4】:

        accepted answer 是正确的。我会添加一个解释。

        令人困惑的黑客

        在 SQL 中,DATE 是没有时间或时区的仅日期值。

        与 Java 捆绑在一起的旧日期时间类一团糟,缺少任何此类来表示仅日期值。

        相反,Java 团队创建了一个 hack。他们通过扩展 java.util.Date 创建了 java.sql.Date,尽管它的名称令人困惑,但它有一个日期部分一个时间部分。对于面向 SQL 的子类,他们将时间部分设置为零值。您可能会将其视为“午夜”。所以 java.sql.Date 一个时间,但假装没有。

        引用java.SQL.Date文档:

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

        对于 SQL 中的日期和时间值,请使用 java.sql.Timestamp 类,如 accepted answer 所示。

        java.time

        这些设计不佳的日期时间类已被 Java 8 及更高版本中内置的新 java.time 包所取代。这个包的灵感来自 Joda-Time 库。

        Java.time 包包括表示仅日期和仅时间类的类。最终,JDBC 驱动程序将升级为直接支持新的数据类型。在那之前,使用添加到新旧类中的几种转换方法。在 StackOverflow.com 上搜索许多示例和讨论,因为这个问题在很大程度上是重复的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-19
          • 1970-01-01
          • 2023-03-13
          • 1970-01-01
          • 2014-08-30
          相关资源
          最近更新 更多