2011-07-29 128 views
19

我有以下查询:JDBC Prepared Statement。 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()也拿到时间呢?

回答

33

而不是日期你应该使用一个Timestamp的setTimestamp方法。

pratically你必须做这样的事情:

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

http://www.mkyong.com/jdbc/how-to-insert-timestamp-value-in-preparedstatement/ –

5

的Java类型java.sql.Date将被标准化为仅代表SQL DATE,而不是时间的瞬间。从API文档:

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

标准化解释了为什么您将00:00:00视为时间。

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

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

0

在SQLServerDatabase侧定义列SMALLDATETIME和Java端使用

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

在SQLServerDatabase侧不指定列类型为时间戳否则你会得到下面的异常。

无法在时间戳列中插入显式值。使用带列列表的INSERT来排除时间戳列,或将DEFAULT插入时间戳列

+0

我为列使用了一个Timestamp mysql数据类型,它工作得很好,没有例外。 –