【问题标题】:Comparing sql dates gone wrong in java比较java中出错的sql日期
【发布时间】:2020-05-08 04:06:34
【问题描述】:

我的代码中有消息传递功能。它是这样的:一个用户,假设是用户 A,在星期一向用户 B 发送了一条消息。我们有两种情况(用户 B 在线/离线),但无论哪种情况,代码都会写入数据库。基本上,消息从用户 A 传输到数据库(获取时间戳 (1)),然后反弹给用户 B。现在用户 B 在第二天(星期二)登录。然后,代码会将用户 B 成功登录时的时间戳 (2) 与用户 A 发送时的时间戳 (1) 进行比较。

我打算这样做:1) 如果时间戳 (1) 小于或等于用户 B 登录的时间戳 (2)(如上例中的星期一与星期二),则显示“您有 n 条消息”与消息本身,或者 2) 如果时间戳 (1) 大于用户 B 登录的时间戳 (2)(周二 vs 周一),那么显然 B 一定已经阅读了这些消息 - 所以我们忽略它,只检查他是否有任何较新的并显示给他。

为此,我编写了这段代码,但它不起作用。即使有新消息,它也不会返回任何内容。我做错了什么?我确实怀疑我的日期比较是错误的。时间戳列 (1) - 消息发送时,在DATETIME

public static String receiveMessage(String email) throws Exception {
    String returnStatement = "";
    Connection connection = null;
    connection = establishConnection();
    String queryCheck = "SELECT * from usersmessages WHERE receiver = ?";
    PreparedStatement prepstate = connection.prepareStatement(queryCheck);
    prepstate.setString(1, email);
    ResultSet resultSet = prepstate.executeQuery();
    while(resultSet.next()) {
        //fine
        String queryCheck_1 = "SELECT * from usersmessages WHERE senttime < DATE(NOW())";
        PreparedStatement prepstate_1 = connection.prepareStatement(queryCheck_1);
        ResultSet resultSet_1 = prepstate_1.executeQuery();

        /* This means the message time is older than the login time */
        if(resultSet_1.next()) {
            System.out.println("check");
            String queryCheck_2 = "SELECT COUNT(*) from usersmessages WHERE senttime < DATE(NOW())";
            PreparedStatement prepstate_2 = connection.prepareStatement(queryCheck_1);
            ResultSet resultSet_2 = prepstate_1.executeQuery();
            int messagecount = resultSet_2.getInt(1);
            returnStatement = "You have " + messagecount + "new messages.";
            for(int i = 0; i < messagecount; i++) {
                returnStatement += "Message " + i + ":\n" + resultSet_2.getString(3);
            }
        }
    }
    return returnStatement;
}

编辑:我在数据库中有 4 列。它们与类型一起在这里:

  • 发件人:varchar
  • 接收者:varchar
  • 消息:varchar
  • 发送时间:日期时间

【问题讨论】:

  • 你能透露一下 DB 列的数据类型吗?
  • 是的。我现在也更新了列和数据类型。

标签: java sql jdbc


【解决方案1】:

您正在查找接收者的消息,然后迭代结果,再次扫描所有消息(与接收者无关)。

您可以将第一个查询更改为以下内容:-

String queryCheck = "SELECT * from usersmessages WHERE receiver = ? and senttime < DATE(NOW()) and isSeen=false";

然后遍历结果以计算新消息并显示。此外,您需要将消息 isSeen 标志标记为 true,否则当用户下次登录时,消息将再次出现。

【讨论】:

  • 所以也许我应该在senttime之后添加一个新列isSeen?
  • 是的,否则条件 senttime
  • 实际上,您能帮我确定消息是如何打印不出来的吗?我确实按照您的方式正确获取了消息数,但它只显示最后一条消息。
  • 可能您没有正确连接味精。如果您可以添加更新的代码,那么我将能够指出错误。
  • 我真的明白了!再次感谢您的热心帮助!
猜你喜欢
  • 1970-01-01
  • 2011-01-11
  • 2017-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多