JDBC准备好的声明。 setDate(…)不保存时间,只保存日期..我怎样才能节省时间?

我有以下查询:

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()加入什么来获得时间?

而不是Date,您应该使用TimestampsetTimestamp方法。

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

 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()); 

Java类型java.sql.Date将被规范化以仅表示SQL DATE而不是Time的瞬间。 从API文档:

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

规范化解释了为什么你会看到00:00:00的时间。

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

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

在SQLServerDatabase端将列定义为SMALLDATETIME并在java端使用

 Timestamp sqlDate = new Timestamp( System.currentTimeMillis() ); preparedStmt.setTimestamp( ++startIndex, sqlDate ); 

在SQLServerDatabase端,不要将列类型指定为Timestamp,否则您将获得以下exception。

无法将显式值插入时间戳列。 将INSERT与列列表一起使用以排除时间戳列,或将DEFAULT插入时间戳列