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 以获得许多示例和讨论,因为这个问题在很大程度上是重复的。
我在 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
而不是 setDatejava.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 以获得许多示例和讨论,因为这个问题在很大程度上是重复的。