次のクエリがあります。
_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の代わりに Timestamp を使用する必要があります=およびsetTimestampメソッド。
実際には、そのようなことをする必要があります:
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 type Java.sql.Date
は、SQL DATE
のみを表すように正規化され、Time of Instantは表しません。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として指定しないでください。指定すると、次の例外が発生します。
タイムスタンプ列に明示的な値を挿入することはできません。列リストでINSERTを使用してタイムスタンプ列を除外するか、タイムスタンプ列にDEFAULTを挿入します