【问题标题】:Delete query working in PgAdmin 3 but not working on Java JDBC删除在 PgAdmin 3 中有效但在 Java JDBC 上无效的查询
【发布时间】:2017-03-31 21:04:32
【问题描述】:

我正在尝试删除保存在数据库中的时间列表,其中日期(end_time - 时间戳)大于我对特定员工的参考日期(employeeId - 整数)。 该查询在 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);
        }


    }
}

【问题讨论】:

  • 您的数据库中的end_time 是什么,时间戳还是日期时间?
  • 我猜第一个条件总是正确的,就像@GuillaumeF.所说的那样,它可能与类型有关。
  • @GuillaumeF。 end_time 是没有时区的时间戳。
  • @JunbangHuang 我还为我的变量尝试了 Date 而不是 Timestamp。就我而言, where 中的第一个条件是日期条件,看起来它被忽略了。仅识别第二个条件“employee_id = ?”。我之前也尝试过交换它们,但也没有用。还有其他方法可以进行此查询吗?
  • @evzpav 你能试试把这个“working_time.end_time”改成“end_time”吗?

标签: java postgresql jdbc sql-delete


【解决方案1】:

我认为首先在条件始终为真的情况下,您应该:

首先:打印 nextDayTimestamp 并确保它是有效的

第二个:如果有效,在postgresql sql查询上试试条件

【讨论】:

  • nextDayTimestamp 类似于 '2017-03-31 12:00:00.0'。我使用它作为字符串连接只是为了检查它是否可以工作,但我得到了相同的结果。它会从数据库中删除该员工的所有内容,忽略日期。
  • 尝试将 2 个变量转换为相同类型,例如不带时间戳的日期,然后重试
【解决方案2】:

如果来自该数据源的连接没有打开 AutoCommit,您的更新将成功,但“事务”永远不会提交,因此在数据库中不会反映您的更改。也许在 executeUpdate 之后添加一个明确的myConn.commit(); 并查看您的更新现在是否显示在数据库中。

【讨论】:

  • 我在 executeUpdate 之后尝试了 myConn.commit() 但我收到了 AutoCommit 已打开的错误。
【解决方案3】:

我找到了答案!我犯了一个错误,叫“从employeeId =?的员工中删除?”从另一种我没有注意到的方法。它处于更高的水平。这就是为什么它要删除每个员工。 我刚刚删除了该方法,我上面的问题中提到的代码确实有效! 非常感谢您为帮助我付出的努力和时间!谢谢!

【讨论】:

    猜你喜欢
    • 2016-07-04
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 2019-12-06
    • 2018-10-28
    • 2013-01-24
    • 2014-07-30
    • 1970-01-01
    相关资源
    最近更新 更多