You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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子句,导致所有符合条件的行被合并为一行返回。

修复方法:将明细查询与求和查询分开:

  1. 明细查询仅获取每行数据
  2. 单独执行求和查询获取总销售额

修改后的完整核心代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 23:36:22