Python中文网

一个关于 编程问题的解答网站.

有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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是错误的,我插入的日期已经清空了时间组件,因此产生了重复密钥异常

所以我问:我该如何纠正这一点,以便真正插入“现在”的日期和时间


共 (3) 个答案

  1. # 1 楼答案

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

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

    相关的:

  2. # 2 楼答案

    {a1}是正确的。我会补充一个解释

    混乱的黑客

    在SQL中,日期是一个只有日期的值,没有一天中的时间或时区

    与Java捆绑在一起的旧日期时间类很混乱,没有任何这样的类来表示仅日期的值

    相反,Java团队创建了一个黑客程序。他们创造了java。sql。通过扩展java来确定日期。util。日期,尽管名称令人困惑,但它有一个日期部分一天中的时间部分。对于面向SQL的子类,它们将时间部分设置为零值。你可能会认为那是“午夜”。所以是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类,如accepted answer所示

    爪哇。时间

    这些设计糟糕的日期时间类已经被新的java取代。Java 8及更高版本内置的时间包。这个软件包的灵感来自Joda Time library

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