2011-07-29 94 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數據類型,它工作得很好,沒有例外。 –