我已经在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个数据库模式,我使用的是错误的模式(旧版本)
答案 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(...)
对象,以更改传递日期的时区。