我有一个数据库,我在其中保存带有 tiemstamps 的消息。我有使用此代码创建的表:
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 语句中有错误(第二个,带有 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());
并在状态中使用它)