java.util.Date 到 java.sql.Date 不包含时间

java.util.Date to java.sql.Date doesn't contain Time

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

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

唯一性约束在buzz_timestamp;也就是说,没有 2 条记录可能具有相同的 date/time "timestamp".

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

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

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

我看到的确切错误(欺骗键)一直在抱怨我试图将 2015-05-27 00:00:00.0000000 插入 table 用于 buzz_timestamp,但它已经存在.所以,很明显,我使用的日期 API 是错误的,并且我插入的日期具有无效的时间分量,从而产生了重复键异常。

所以我问:如何更正此问题以便我真正插入 "now" 的日期和时间?

使用

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

看到这个:Using setDate in PreparedStatement

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

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

相关:

  • mssql 2005 datetime and jdbc

您需要尝试使用 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

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

令人困惑的黑客

在 SQL 中,DATE 是缺少时间或时区的纯日期值。

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

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

引用 java.SQL.Date 文档:

To conform with the definition of SQL DATE, the millisecond values wrapped by a java.sql.Date instance must be 'normalized' by setting the hours, minutes, seconds, and milliseconds to zero in the particular time zone with which the instance is associated.

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

java.time

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

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