Удалить запрос, работающий в PgAdmin 3, но не работающий на Java JDBC

Я пытаюсь удалить список раз, сохраненный в базе данных, где дата (end_time - timestamp) больше, чем мой контрольный день для конкретного сотрудника (employeeId - integer). Запрос отлично работает на pgAdmin III. Однако я не могу заставить его работать в JDBC. Это работает, но удаляет все от этого конкретного сотрудника, а не только даты, которые я хочу. Похоже, он игнорирует дату в предложении Where. Кроме того, я не получаю никаких исключений. Переменная nextDayTimestamp выглядит так: «2017-03-31 12:00:00.0». Кто-нибудь может помочь?

 public void deleteBigListOfPeriodOfWorkFutureOnly(int employeeId, LocalDate referenceDate) {
        Connection myConn = null;
        PreparedStatement myStmt = null;

        try {

            myConn = dataSource.getConnection();

            LocalDate nextDay = referenceDate.plusDays(1);
            Timestamp nextDayTimestamp = Timestamp.valueOf(LocalDateTime.of(nextDay, LocalTime.NOON));
            String sql = "delete from working_time where working_time.end_time > ? and employee_id = ?";

            myStmt = myConn.prepareStatement(sql);

            myStmt.setTimestamp(1, nextDayTimestamp);
            myStmt.setInt(2, employeeId);

            myStmt.executeUpdate();

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {

            CloseConnection.close(myConn, myStmt, null);
        }


    }
}

образец таблицы рабочего_времени


person evzpav    schedule 31.03.2017    source источник
comment
Что такое end_time в вашей базе данных, метка времени или дата/время?   -  person Guillaume F.    schedule 01.04.2017
comment
Я предполагаю, что первое условие всегда верно, как сказал @GuillaumeF., это может быть как-то связано с типом.   -  person Junbang Huang    schedule 01.04.2017
comment
@Гийом Ф. end_time — временная метка без часового пояса.   -  person evzpav    schedule 01.04.2017
comment
@JunbangHuang Я также попробовал Date вместо Timestamp для своей переменной. В моем случае первое условие в where - это условие даты, и похоже, что оно игнорируется. Просто второе условие employee_id = ? признан. Я тоже пытался их поменять местами раньше, и тоже не получилось. Есть ли другой способ выполнить этот запрос?   -  person evzpav    schedule 01.04.2017
comment
@evzpav, вы можете попробовать изменить это рабочее_время.конечное_время на конечное_время?   -  person Junbang Huang    schedule 01.04.2017
comment
@JunbangHuang Спасибо за ответ! Я пробовал это уже раньше. Я также попытался изменить executeUpdate() на execute(), я также обновил файл jar postgres, я также попытался изменить свою переменную на Date вместо Timestamp. Я не получаю никаких ошибок, никаких исключений. Просто предложение where для даты как-то игнорируется.   -  person evzpav    schedule 01.04.2017
comment
@evzpav можешь поделиться схемами?   -  person Junbang Huang    schedule 01.04.2017
comment
@JunbangHuang, пожалуйста, смотрите изображение выше в описании вопроса.   -  person evzpav    schedule 01.04.2017
comment
@evzpav Я попробовал твой код. Он должен работать. Верен ли исходный день? Извините, приходится подозревать все. Не могу понять, что не так   -  person Junbang Huang    schedule 01.04.2017
comment
@JunbangHuang referenceDate указан как LocalDate: 31 марта 2017 года. Я проверил это с помощью отладчика IntelliJ.   -  person evzpav    schedule 01.04.2017


Ответы (3)


Я думаю, что сначала, когда условие всегда верно, вы должны:

Во-первых: распечатайте nextDayTimestamp и убедитесь, что он действителен

Во-вторых: если это действительно так, попробуйте условие в запросе postgresql sql

person Fady Saad    schedule 31.03.2017
comment
NextDayTimestamp выглядит как «2017-03-31 12:00:00.0». Я использовал его объединение в виде строки, чтобы проверить, будет ли он работать, но получил тот же результат. Он удаляет все из базы данных для этого сотрудника, игнорируя дату. - person evzpav; 01.04.2017
comment
Попробуйте преобразовать 2 переменные в один и тот же тип, например, дату без метки времени, и повторите попытку. - person Fady Saad; 01.04.2017

Если для соединения, выходящего из этого источника данных, не включена функция AutoCommit, ваше обновление будет выполнено успешно, но «транзакция» никогда не будет зафиксирована, поэтому в базе данных не будут отражены ваши изменения. Возможно, поместите явное myConn.commit(); после этого executeUpdate и посмотрите, отображаются ли ваши обновления в базе данных.

person Bob Kuhar    schedule 31.03.2017
comment
Я попробовал это myConn.commit() после executeUpdate, но получил ошибку, связанную с включением AutoCommit. - person evzpav; 01.04.2017

Я узнал ответ! Я сделал ошибку, вызвав "удалить у сотрудника, где employeeId=?" от другого метода, который я не замечал. Это было на более высоком уровне. Вот почему он удалял всех сотрудников. Я только что удалил этот метод, и КОД, УПОМЯНУТЫЙ В МОЕМ ВОПРОСЕ ВЫШЕ, РАБОТАЕТ! Большое спасибо за усилия и время, пытаясь помочь мне! СПАСИБО!

person evzpav    schedule 01.04.2017