SQL应该在java中运行

时间:2011-03-31 14:34:13

标签: java sql postgresql

我已经在pgAdmin中测试了我的sql,它返回结果很好。但是,在Java中,当日期为25/03/2011和30/03/2011时,它不会返回任何值,但是当开始时间是23/03/2011时它会返回。

我有System.out.println'ed我创建的sql并在pgAdmin中运行它并且它返回结果很好,但在java中它没有,任何想法为什么?数据库正在打开和关闭,以及判断和结果设置正常,我没有看到问题?这是我的代码片段

String sql = "SELECT Salesrep.Name, SUM(OrderLine.Quantity) AS Total_Sold, SUM(OrderLine.UnitSellingPrice * Orderline.Quantity) AS Total_Value"
            + " FROM SalesRep, OrderLine, ShopOrder WHERE ShopOrder.SalesRepID = SalesRep.SalesRepID"
            + " AND OrderLine.ShopOrderID = ShopOrder.ShopOrderID"
            + " AND ShopOrder.OrderDate BETWEEN '"+start+"' AND '"+finish+"'"
            + " GROUP BY SalesRep.SalesRepID, SalesRep.Name "
            + " ORDER BY Total_Value DESC";
            System.out.println(sql);
    try {
        rs = Database.stmt.executeQuery(sql);
        String name;
        int total;
        double totalPrice;
        int count = 0;
        String output;

        if (rs.next()) {
            System.out.println("Sales representative performace review from " + start + " to " + finish);
            name = rs.getString(1);
            total = rs.getInt(2);
            totalPrice = rs.getDouble(3);
            output = String.format("%-20s %-18s %-15s", "Sales Rep", "Total units sold", "Total Value");
            System.out.println(output);
            output = String.format("%-20s %-18d £%-15.2f", name, total, totalPrice);
            System.out.println(output);
            count++;
            while (rs.next()) {
                name = rs.getString(1);
                total = rs.getInt(2);
                totalPrice = rs.getDouble(3);
                output = String.format("%-20s %-18d £%-15.2f", name, total, totalPrice);
                System.out.println(output);
                count++;
            }
        }
        if (count > 0) {
            System.out.println("\r\nQuery complete with " + count + " results! \r\n");
        } else {
            System.out.println("\r\nSorry.. no results! \r\n");
        }
        rs.close();

解决:
我有2个数据库模式,我使用的是错误的模式(旧版本)

1 个答案:

答案 0 :(得分:1)

尝试使用PreparedStatement而不是将您的值连接在一起。我还建议不要打印\r个字符,除非你真的想从一行的开头覆盖。我已经重写了部分代码,以显示我通常如何做到这一点;希望它对你有用:

PreparedStatement ps = Connection.prepareStatement("SELECT Salesrep.Name, SUM(OrderLine.Quantity) AS Total_Sold, SUM(OrderLine.UnitSellingPrice * Orderline.Quantity) AS Total_Value"
            + " FROM SalesRep, OrderLine, ShopOrder WHERE ShopOrder.SalesRepID = SalesRep.SalesRepID"
            + " AND OrderLine.ShopOrderID = ShopOrder.ShopOrderID"
            + " AND ShopOrder.OrderDate BETWEEN ? AND ?"
            + " GROUP BY SalesRep.SalesRepID, SalesRep.Name "
            + " ORDER BY Total_Value DESC";
try {
    ps.setDate(1, start);
    ps.setDate(2, finish);

    ResultSet rs = ps.executeQuery();
    try {
        String name;
        int total;
        double totalPrice;
        int count = 0;
        String output;

        while (rs.next()) {
            if (count == 0) {
                System.out.printf("%-20s %-18s %-15s\n", "Sales Rep", "Total units sold", "Total Value");
            }

            count++;
            System.out.println("Sales representative performace review from " + start + " to " + finish);
            name = rs.getString(1);
            total = rs.getInt(2);
            totalPrice = rs.getDouble(3);
            System.out.printf("%-20s %-18d £%-15.2f\n", name, total, totalPrice);
        }

        if (count > 0) {
            System.out.println("\nQuery complete with " + count + " results!\n");
        } else {
            System.out.println("\nSorry.. no results!\n");
        }
    }
    finally {
        rs.close();
    }
}
finally {
    ps.close();
}

如果这不起作用,则可能是时区问题。在Calendar中传递ps.setDate(...)对象,以更改传递日期的时区。