Сравнение sql дат ошибочно в java - PullRequest
0 голосов
/ 08 мая 2020

В моем коде есть функция обмена сообщениями. Это выглядит так: пользователь, скажем, пользователь A, отправляет пользователю B сообщение в понедельник. У нас есть два случая (пользователь B находится в сети / в автономном режиме), но в любом случае код все равно будет записывать в базу данных. По сути, сообщение передается от пользователя A в базу данных (получает отметку времени (1)), а затем возвращается пользователю B. Теперь пользователь B входит в систему на следующий день, во вторник. Затем код сравнивает отметку времени (2) в момент успешного входа пользователя B в систему с отметкой времени (1), когда пользователь A ее отправляет.

Я намереваюсь сделать: 1) если отметка времени (1) меньше или равна отметке времени (2) входа пользователя B (понедельник или вторник, как в примере выше), то отобразите "У вас есть n messages "вместе с самими сообщениями, или 2) если метка времени (1) больше, чем метка времени (2) входа пользователя B (вторник против понедельника), то очевидно, что 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;
}

EDIT: У меня 4 столбца в БД. Вот они вместе с типами:

  • отправитель: varchar
  • получатель: varchar
  • сообщение: varchar
  • senttime: datetime

1 Ответ

2 голосов
/ 08 мая 2020

Вы находите сообщения для получателя, затем повторяете результат, снова просматривая все сообщения (независимо от получателя).

Вы можете изменить первый запрос на следующее: -

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

Затем перебрать результат для подсчета новых сообщений и отображения. Также вам нужно будет отметить флаг isSeen сообщения как истинный, потому что в противном случае сообщения появятся снова, когда пользователь войдет в систему в следующий раз.

...