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()) + "')"
しかし、私は自分が間違っていることを理解していません。
エラーの説明 によると、データベースに不正なタイプを挿入しています。 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();
まず、文字列の連結を使用しないでください。 SQLインジェクション について気にしたことがありますか?
これを行う正しい方法は、準備済みステートメントを使用することです。
アイデアは、プレースホルダーでステートメントを定義し、それらのプレースホルダーの値を定義することです。
詳細は @ Taky ' sの回答を参照してください。
dateFormat#format
このメソッドは、Date
オブジェクトではなく、フォーマットされた文字列を返します。 docs によると、データベースフィールドはDateTime
であり、Java.sql.Timestamp
がString
ではなくそこに挿入されることを期待しています。
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());
Joda フレームワークを使用して日付/時刻を操作できます。独自の日付/時刻型をHibernate/SQL型に問題なくマップします。 HQLクエリでパラメーターを設定すると、jodaは正しい型マッピングを実行します。
これは、文字列の日付値を日付タイプのDBフィールドに保存しようとしているためです。
データdataTypeに変換します
datetime "unseparated" format yyyymmdd hh:mm:ss
を使用することもできます