2017-06-25 8 views
1

Also habe ich diese Abfrage mit DATEDIFF Funktion auf MS SQL Server?Erhalten Sie den Rückgabewert des Datums diff?

SELECT DATEDIFF(DAY,(select StartDate from CarOrder where OrderID= 59),(select EndDate from CarOrder where OrderID= 59)) 

Diese Arbeit gut und das Ergebnis ist 10, aber ich weiß nicht, wie der Rückgabewert zu erhalten und java es in dieser Funktion für

public int getDateDiff(int OrderID){ 
    Connection conn = DBConnection.getConnection(); 
    int datediff; 
    String getdiffSQL = "SELECT DATEDIFF(DAY,(select StartDate from CarOrder where OrderID = ?) ,(select EndDate from CarOrder where OrderID= ?))"; 
    try { 
     PreparedStatement pstm = conn.prepareStatement(getdiffSQL); 
     pstm.setInt(1, OrderID); 
     pstm.setInt(2, OrderID);    
     int nRows = pstm.executeUpdate(); 
     return nRows; 
    } catch (SQLException ex) { 
     System.out.println("Error: " + ex.getMessage()); 
    } finally { 
     DBConnection.closeConnection(conn); 
    } 

} 

ich es verwenden möchten, das Datum diff Zahl so zurück dass es eine Variable ist, die ich in Java verwenden kann, wie kann ich das tun? Danke.

+1

Können Sie genau erklären, was mit dem Code oben falsch ist? –

+0

da ist nichts falsch, ich brauche nur den Rückgabewert von datediff und bekomme es eine Variable, die ich in Java verwenden kann. –

+1

Nicht relevant für Ihre Frage aber die Abfrage wäre besser als 'SELECT DATEDIFF (DAY, StartDate, EndDate) FROM CarOrder WHERE OrderID =?' –

Antwort

2

Verwenden ResultSet

Sie müssen die ResultSet erfassen, und Zugriff auf die Zeilen dieser ResultSet (in diesem Fall eine einzige Zeile). Wenn Sie eine Abfrage ausführen, rufen Sie executeQuery auf Ihrer PreparedStatement, wodurch eine ResultSet produziert.

Verwenden Sie die moderne Syntax try-with-resources, um Ihre Datenbankressourcen automatisch zu schließen. Sie können die finally Klauseln fallenlassen; Sie müssen closeXXX nicht auf Ihren Datenbankressourcen aufrufen, da diese Aufgabe für Sie erledigt wird.

Ich habe nicht versucht, Ausführen des folgenden Codebeispiels, aber ich hoffe, es ist in der Nähe, was Sie brauchen. Ich benutze die alternative SELECT Linie vorgeschlagen in Kommentar von Martin Smith; Ich habe nicht darüber nachgedacht, da es nicht der Kern Ihrer Frage ist.

String sql = "SELECT DATEDIFF(DAY , StartDate , EndDate) FROM CarOrder WHERE OrderID = ? ;" ; 

Integer diff = null ; 
try ( 
     Connection conn = myDataSource.getConnection() ; 
     PreparedStatement pstmt = conn.prepareStatement (sql) ; 
    ) { 
     pstmt.setInt(1 , orderId) ; 
     try ( 
      ResultSet rs = pstmt.executeQuery(sql) ; 
     ) { 
      while (rs.next ()) { 
       diff = rs.getInt(1) ; // Auto-boxing `int` to `Integer`. 
      } 
     } 
    } 
} catch (SQLException e) { 
    e.printStackTrace (); // Handle error condition however you see fit. 
} 

if(null == diff) { 
    System.out.println("mission failed.") ; 
} else { 
    System.out.println("mission succeeded. Diff is: " + diff) ; 
} 

Für echte Arbeit, würde ich auch sicher, testen hatte ich nur eine Zeile zurückgegeben (stellen Sie sicher, dass while Schleife läuft genau einmal, anstatt null oder mehr als einmal).

Wenn Sie über die verschiedenen Datenbankressourcen nicht klar ist (Datasource, Verbindung, PreparedStatement, ResultSet), sollten Sie die IDE hinstellen und einige weitere Studie der Oracle Tutorial on JDBC matters tun, und einige Benutzer tun/von Stack-Überlauf des Studium zum Thema.

0

Speichern Sie das Ergebnis der Abfrage im ResultSet-Objekt und wählen Sie dann den Wert der entsprechenden Spalte mithilfe von {YOUR_RESULT_SET} .getYourDataType (columnNumber) aus.

Verwandte Themen