sql server java。util。日期到爪哇。sql。日期不包含时间
我在PreparedStatement
上得到了一个SqlException
,因为违反了表的唯一性约束(dupe key)。我的桌子基本上是这样的:
mytable
=======
mytable_id PRIMARY KEY INT NOT NULL
fizz_id INT NOT NULL
buzz_timestamp DATETIME
唯一性约束在buzz_timestamp
上;也就是说,没有两条记录具有相同的日期/时间“时间戳”
将记录插入此表的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键)一直在抱怨我试图将2015-05-27 00:00:00.0000000
插入buzz_timestamp
的表中,但它已经存在。所以,很明显,我使用的日期API是错误的,我插入的日期已经清空了时间组件,因此产生了重复密钥异常
所以我问:我该如何纠正这一点,以便真正插入“现在”的日期和时间
# 1 楼答案
使用
看到这个:Using setDate in PreparedStatement
# 2 楼答案
{a1}是正确的。我会补充一个解释
混乱的黑客
在SQL中,日期是一个只有日期的值,没有一天中的时间或时区
与Java捆绑在一起的旧日期时间类很混乱,没有任何这样的类来表示仅日期的值
相反,Java团队创建了一个黑客程序。他们创造了java。sql。通过扩展java来确定日期。util。日期,尽管名称令人困惑,但它有一个日期部分和一天中的时间部分。对于面向SQL的子类,它们将时间部分设置为零值。你可能会认为那是“午夜”。所以是java。sql。Date有一天中的某个时间,但假装没有
引用^{} 文件:
对于SQL中的日期和时间值,请使用
java.sql.Timestamp
类,如accepted answer所示爪哇。时间
这些设计糟糕的日期时间类已经被新的java取代。Java 8及更高版本内置的时间包。这个软件包的灵感来自Joda Time library
爪哇。时间包包括表示仅日期和仅时间类的类。最终,JDBC驱动程序将被升级,以直接支持新的数据类型。在此之前,请使用添加到新旧类中的几种转换方法。搜索堆栈溢出。com的许多例子和讨论,因为这个问题在很大程度上是重复的
# 3 楼答案
java.sql.Date
扩展了java.util.Date
,但工作方式不同:在SQL中,DATE
没有时间。因此,Java对象也会忽略小时、分钟等尝试
java.sql.Timestamp
,但可能需要一个强制转换(在SQL中)将其转换为DATETIME
相关的: