私はタイムスタンプ付きのメッセージを保存しているデータベースを持っています。このコードでテーブルを作成しました:
CREATE TABLE messages (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
msgid VARCHAR(64) UNIQUE,
payload TEXT,
sender VARCHAR(255),
cur_timestamp TIMESTAMP(3)
);
これはすべて完璧に機能します。ただし、現在、ユーザーが指定したタイムスタンプよりも古いタイムスタンプを持つ行を削除しようとしています。これは、私のシステムの Java 部分で次のように行われます。
// get current timestamp
Date date = new Date();
// timestamp has to be in the same format as in database
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd h:mm:ss.SSS");
String formattedDate = sdf.format(date);
System.out.println("Current time: " + formattedDate);
// subtract desired time
if (msgOld.equals("hour")) {
date.setTime(date.getTime() - ONE_HOUR_MILLISCONDS);
formattedDate = sdf.format(date);
} else if (msgOld.equals("day")) {
date.setTime(date.getTime() - ONE_DAY_MILLISCONDS);
formattedDate = sdf.format(date);
}
これも問題なく動作します。定数は次のようになります。final long ONE_HOUR_MILLISCONDS = 60 * 60 * 1000;
唯一の問題は、JDBC でクエリを記述する方法がわからないことです。私はこれをやってみました:
// prepare query
String query;
if (msgOld.equals("all")) {
query = "TRUNCATE TABLE messages";
} else {
query = "DELETE FROM messages WHERE cur_timestamp < " + date + ";";
}
しかし、SQLステートメントにエラーがあると表示されます(2番目のTRUNCATEを使用したものは正常に機能します)。ステートメントのformattedDate
代わりに入れてみました。date
java.util.Date
何が問題なのですか (おそらく本当に単純なものです -と SQL タイムスタンプの違いかもしれません...)? ヒントをありがとう!
編集:すべての応答に感謝します...次のような準備済みステートメントを使用するようにコードを書き直しました:
// prepare query
String query;
PreparedStatement pstmt = null;
try {
if (msgOld.equals("all")) {
query = "TRUNCATE TABLE messages";
pstmt=conn.prepareStatement(query);
} else {
query = "DELETE FROM messages WHERE cur_timestamp < ?;";
pstmt = conn.prepareStatement(query);
pstmt.setString(1, timestamp.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
try {
pstmt.execute();
System.out.println("Successfully deleted messages.");
pstmt.close();
} catch (Exception e) {
System.out.println("Error with db query.");
e.printStackTrace();
}
しかし、まだSQL例外が発生しています(日付をタイムスタンプに変換し、このようTimestamp timestamp = new Timestamp(date.getTime());
にしてステートメントで使用しても)