web-dev-qa-db-ja.com

Java:テーブルの日時データに挿入する

MS-SQLデータベースの変数に現在の日付と時刻を挿入しようとしています。私はこのフォーマットを使用します:

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
Calendar cal = Calendar.getInstance();  
System.out.println(dateFormat.format(cal.getTime()));

そして私は結果としてこれを受け取ります2013-01-28 09:29:37.941

データベースの私のフィールドはdatetimeと定義されており、同じフィールドを持つ他のテーブルで見たように、日付と時刻はこの2011-07-05 14:18:33.000のように正確に書き込まれます。

Javaプログラム内で行うクエリを使用してデータベースに挿入しようとしましたが、このエラーが発生します

SQL例外:状態:S0003メッセージ:varcharデータ型から値の日時データ型への変換は範囲外です。エラー:242

私のクエリはそのようなものです:

query = "INSERT INTO Companies CreatedOn"+ 
         "VALUES ('" + dateFormat.format(cal.getTime()) + "')"

しかし、私は自分が間違っていることを理解していません。

9
Dimitra Micha

エラーの説明 によると、データベースに不正なタイプを挿入しています。 JDBC to MSSQL を参照してください。カレンダーを Timestamp に変換する必要があります。

使用してみてください:

PrepareStatement statement 
    = connection.prepareStatement("INSERT INTO Companies CreatedOn VALUES(?)");
Java.sql.Timestamp timestamp = new Java.sql.Timestamp(cal.getTimeInMillis());
statement.setTimestamp(1, timstamp);
int insertedRecordsCount = statement.executeUpdate();
18
Taky

まず、文字列の連結を使用しないでください。 SQLインジェクション について気にしたことがありますか?

これを行う正しい方法は、準備済みステートメントを使用することです。

アイデアは、プレースホルダーでステートメントを定義し、それらのプレースホルダーの値を定義することです。

詳細は @ Taky ' sの回答を参照してください。

3
Betlista

dateFormat#formatこのメソッドは、Dateオブジェクトではなく、フォーマットされた文字列を返します。 docs によると、データベースフィールドはDateTimeであり、Java.sql.TimestampStringではなくそこに挿入されることを期待しています。

SQL DATEの定義に準拠するには、インスタンスが関連付けられている特定のタイムゾーンで時間、分、秒、ミリ秒をゼロに設定することにより、Java.sql.Dateインスタンスによってラップされたミリ秒の値を「正規化」する必要があります。 。

クエリでStringではなくJava.sql.Timestampオブジェクトを試してください。PreparedStatementを使用することをお勧めします。

現在の日付と時刻を保存する場合は、[〜#〜] mysql [〜#〜]組み込みメソッドNOW()。簡単なドキュメントについては、 http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html を参照してください。コードは次のようになります。

INSERT INTO Companies CreatedOn VALUES(NOW())"

ただし、Java Date-utilを使用して実行する場合は、

Calendar cal = Calendar.getInstance(); 
Java.sql.Timestamp timestamp = new Timestamp(cal.getTimeInMillis());
0
arvin_codeHunk

Joda フレームワークを使用して日付/時刻を操作できます。独自の日付/時刻型をHibernate/SQL型に問題なくマップします。 HQLクエリでパラメーターを設定すると、jodaは正しい型マッピングを実行します。

0
Denys

これは、文字列の日付値を日付タイプのDBフィールドに保存しようとしているためです。

データdataTypeに変換します

datetime "unseparated" format yyyymmdd hh:mm:ssを使用することもできます

0
TheWhiteRabbit