gpt4 book ai didi

java - JDBC 删除数据库中具有特定时间戳的行

转载 作者:太空宇宙 更新时间:2023-11-03 12:24:37 25 4
gpt4 key购买 nike

我有一个数据库,我在其中保存带有时间戳的消息。我用这段代码创建了表:

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 timestamp 之间的区别...)?感谢您提供任何提示!

编辑:感谢所有回复...我重写了代码,因此它使用了如下准备好的语句:

// 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()); 并在声明中使用它)

最佳答案

您不能只是将 java.util.Date 对象连接到查询字符串中。这是错误的。

这种情况最好使用PreparedStatement

看看本教程 example

关于java - JDBC 删除数据库中具有特定时间戳的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18204198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com