JDBC 准备语句 .setDate(....) 不会节省时间,只会保存日期。我怎样才能节省时间?

2022-09-02 03:05:38

我有以下查询:

INSERT INTO users (user_id, date_created) VALUES (?,?)

我有以下准备好的发言稿

PreparedStatement insertUser = dbConnection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

insertUser.setInt(1, 7);
java.util.Date now = new java.util.Date(System.currentTimeMillis());
insertUser.setDate(2, new java.sql.Date((new Date(System.currentTimeMillis())).getTime()));
insertUser.executeUpdate();

如果我检查数据库,我发现它只插入了今天的日期而不是时间,所以它将是:2011-07-29 00:00:00

我应该投入什么才能获得时间?setDate()


答案 1

您应该使用时间戳和 setTimestamp 方法,而不是 Date

实际上,你必须做这样的事情:

private static java.sql.Timestamp getCurrentTimeStamp() {
    java.util.Date today = new java.util.Date();
    return new java.sql.Timestamp(today.getTime());
}

....

preparedStatement.setTimestamp(4,getCurrentTimeStamp());

答案 2

Java 类型将被规范化为仅表示时间的瞬间,而不是时间的瞬间。从 API 文档中:java.sql.DateSQL DATE

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

规范化解释了为什么你把时间看作时间。00:00:00

如果要保留时间信息,请考虑使用可以同时表示日期和时间的 Timestamp 类。

显然,您还应该使用相应的SQL类型来定义表结构;如果要在数据库中存储时间戳,请使用数据库首选的 SQL 类型。虽然某些数据库及其 JDBC 驱动程序可能允许您在列中存储时间戳,但如果该类型可用,则建议使用该类型的等效项。DATESQL TIMESTAMP


推荐