web-dev-qa-db-ja.com

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()に何を入れればよいですか?

21
Wael Awada

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

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タイプと同等のものを使用できる場合は、それを使用することをお勧めします。

6
Vineet Reynolds

SQLServerDatabase側でSMALLDATETIMEとして列を定義し、Java側で使用します

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

SQLServerDatabase側では、列タイプをTimestampとして指定しないでください。指定すると、次の例外が発生します。

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

0
A Jakhar