10

現在の日付と時刻を 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 データ型から値の datetime データ型への変換が範囲外です。エラー: 242

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

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

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

4

6 に答える 6

20

エラーの説明によると、間違った型をデータベースに挿入しています。JDBC から MSSQLを参照してください。Calendar を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();
于 2013-01-28T08:45:55.020 に答える
3

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

それを行う正しい方法は、準備されたステートメントを使用することです:

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

詳細については、 @Takyの回答を参照してください。

于 2013-01-28T08:51:36.640 に答える
1

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

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

クエリで文字列の代わりにオブジェクトを試してください。java.sql.Timestampを使用することをお勧めしますPreparedStatement

于 2013-01-28T08:43:09.013 に答える
0

現在の日付と時刻を保存する場合は、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());
于 2013-01-28T09:13:03.267 に答える
0

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

それをDatadataTypeに変換します

日時の「分離されていない」形式を使用することもできますyyyymmdd hh:mm:ss

于 2013-01-28T08:43:35.133 に答える
0

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

于 2013-01-28T08:57:16.483 に答える