MySQL日期范围查询表格显示异常及销售额求和展示问题求助
问题解决与代码优化
问题1:日期输入为空时表格无内容
原因是while循环内的for循环逻辑错误,重复添加相同字段导致Vector元素数量与表格列数不匹配,无法正确渲染。
修复方法:按结果集的列索引逐个获取数据,而非重复添加三个字段:
while(rs.next()) { Vector v2 = new Vector(); // 按列数逐个获取对应列的值 for(int i = 1; i <= table; i++){ v2.add(rs.getString(i)); } load.addRow(v2); }
问题2:日期范围内两条数据仅显示一行
原因是SQL中使用了聚合函数SUM(amount_due)但未添加GROUP BY子句,导致所有符合条件的行被合并为一行返回。
修复方法:将明细查询与求和查询分开:
- 明细查询仅获取每行数据
- 单独执行求和查询获取总销售额
修改后的完整核心代码:
private void table_stocks(String date_from, String date_to) { try { Class.forName("com.mysql.cj.jdbc.Driver"); try (Connection con = DriverManager.getConnection(url, username, password)) { DefaultTableModel load = (DefaultTableModel)jTable_salesValue.getModel(); load.setRowCount(0); if(date_from.isEmpty() || date_to.isEmpty()){ // 查询全部明细 String sql = "SELECT `sales_number`, `date`, `amount_due` FROM `dnk_database`.`sales`;"; try (PreparedStatement pst = con.prepareStatement(sql); ResultSet rs = pst.executeQuery()) { ResultSetMetaData rsd = rs.getMetaData(); int table = rsd.getColumnCount(); while(rs.next()) { Vector v2 = new Vector(); for(int i = 1; i <= table; i++){ v2.add(rs.getString(i)); } load.addRow(v2); } } // 空日期时总销售额查询全部数据 String sumSql = "SELECT SUM(`amount_due`) AS `total_sales` FROM `dnk_database`.`sales`;"; try (PreparedStatement sumPst = con.prepareStatement(sumSql); ResultSet sumRs = sumPst.executeQuery()) { if(sumRs.next()){ String sum_total = sumRs.getString("total_sales"); jTextField_totalSales.setText(sum_total != null ? sum_total : "0"); } } } else{ // 1. 查询指定日期范围的明细 String sql = "SELECT `sales_number`, `date`, `amount_due` FROM `dnk_database`.`sales` WHERE `date` BETWEEN ? AND ?;"; try (PreparedStatement pst = con.prepareStatement(sql)) { pst.setString(1, date_from); pst.setString(2, date_to); try (ResultSet rs = pst.executeQuery()) { ResultSetMetaData rsd = rs.getMetaData(); int table = rsd.getColumnCount(); while(rs.next()) { Vector v2 = new Vector(); for(int i = 1; i <= table; i++){ v2.add(rs.getString(i)); } load.addRow(v2); } } } // 2. 查询指定日期范围的总销售额 String sumSql = "SELECT SUM(`amount_due`) AS `total_sales` FROM `dnk_database`.`sales` WHERE `date` BETWEEN ? AND ?;"; try (PreparedStatement sumPst = con.prepareStatement(sumSql)) { sumPst.setString(1, date_from); sumPst.setString(2, date_to); try (ResultSet sumRs = sumPst.executeQuery()) { if(sumRs.next()){ String sum_total = sumRs.getString("total_sales"); jTextField_totalSales.setText(sum_total != null ? sum_total : "0"); } } } } } catch (ClassNotFoundException ex) { Logger.getLogger(Add_Items.class.getName()).log(Level.SEVERE, null, ex); } } catch (SQLException ex) { Logger.getLogger(Add_Items.class.getName()).log(Level.SEVERE, null, ex); } }
补充说明:如果数据库中date字段是DATE类型,需确保传入的日期格式为yyyy-MM-dd,若输入是MM/dd/yyyy格式,需在SQL中转换:
WHERE STR_TO_DATE(`date`, '%m/%d/%Y') BETWEEN STR_TO_DATE(?, '%m/%d/%Y') AND STR_TO_DATE(?, '%m/%d/%Y')
问题3:求和结果的代码放置位置
如上述代码所示,求和查询需在明细查询完成后执行,单独获取总销售额并设置到文本框。同时需处理SUM返回null的情况(当日期范围内无数据时),避免空指针异常。
内容的提问来源于stack exchange,提问作者Ancheta Laurent Antoine C
相关产品推荐
相关产品推荐

