2011-07-29 6 views
19

私は次のクエリを持っている: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()に何を入力する必要がありますか?

答えて

33

代わりのあなたはTimestampsetTimestampメソッドを使用する必要があります。

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に相当する型を使用することをお勧めします。 SQLServerDatabase側

0

SMALLDATETIMEとして列を定義し、SQLServerDatabase側でJava側での使用に

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

では、次の例外が発生します、他のタイムスタンプとして、列の型を指定しないでください。

タイムスタンプ列に明示的な値を挿入できません。 INSERTを使用して列リストを使用してタイムスタンプ列を除外するか、またはDEFAULTをタイムスタンプ列に挿入する

+0

私は、列のTimestamp mysqlデータ型を使用し、それは例外なしで正常に機能しました。 –

関連する問題