2017-01-01 1 views
0

in meinem kleinen Testprogramm habe ich einige SQL-Abfragen. Die erste SELECT * FROM kilometer; funktioniert ordnungsgemäß und gibt alle Spalten in der Tabelle zurück. So gibt ResultSet rs = stmt.executeQuery("SELECT * FROM kilometer;"); in Java eingebettet ein ResultSet zurück, das nicht leer ist.SQL Lite-Abfrage (zwischen in Daten) funktioniert nicht

Jetzt wollte ich nur die Zeilen innerhalb eines bestimmten Datums erhalten. Aber meine eingebettete Abfrage ResultSet rs = stmt.executeQuery("SELECT * FROM kilometer WHERE datum BETWEEN '2016-01-01' AND '2016-12-31';"); gibt ein leeres ResultSet zurück. Aber ich habe es online getestet und es hat richtig funktioniert. Wo ist mein Fehler? Ich habe bereits einige Seiten wie this konsultiert, aber ich kann den Fehler nicht finden.

Ich verwende SQLite 3.15.1 und Java SE 8.

Voll Java-Code:

public ArrayList<Strecke> getErgebnisse(final String startzeitpunkt, final String zielzeitpunkt) { 
ArrayList<Strecke> strecken = new ArrayList<>(); 
try { 
    try { 
     if (connection != null) { 
     } 
     connection = DriverManager.getConnection("jdbc:sqlite:" + DB_PATH); 
     if (!connection.isClosed()) 
    } catch (SQLException e) { 
     throw new RuntimeException(e); 
    } 
    Statement stmt = connection.createStatement(); 
    ResultSet rs = stmt.executeQuery("SELECT * FROM kilometer WHERE datum BETWEEN '2016-01-01' AND '2016-12-31';"); 
    while (rs.next()) { 
     strecken.add(new Strecke(Instant.ofEpochMilli(rs.getDate("datum").getTime()).atZone(ZoneId.systemDefault()).toLocalDate(), rs.getString("startort"), rs.getString("zielort"), rs.getDouble("kilometer"))); 
    } 
    rs.close(); 
    connection.close(); 
} catch (SQLException e) { 
    e.printStackTrace(); 
    } 
    return strecken; 
} 
+0

Warum haben Sie 'try' in' try' verwendet, und 'if (connection! = Null)' Abschnitt hat keinen Code? –

+0

Kopieren + Einfügen. Ich werde es jetzt besser machen. ;) –

Antwort

0

Zunächst einmal würde ich empfehlen, dass Sie vorbereitete Anweisungen verwenden, während der Ausführung von Abfragen, anstatt die der Weitergabe Abfrage direkt als String ...... zweitens glaube ich, das Problem hier ist, dass Sie das Datum als String in Anführungszeichen übergeben und nicht ein Datum ..... Ich denke, das ist das Problem hier. Sie müssten dafür sqlites datetime Funktionen verwenden ....

+0

Warum ein Downvote ?? – prashant

+0

Es war nicht ich. Aber immer noch 'ResultSet rs = stmt.executeQuery ("SELECT * FROM Kilometer WHERE Datum BETWEEN" + Date.valueOf ("2016-01-01") + "AND" + Datum.valueOf ("2016-12-31") + ";"); 'ist nach dem Wechsel zu Datum leer. –

+0

Nicht Java-Datum Ich sprach über die Verwendung von SQLITE-Datumsfunktionen für Datum und Datum .... alternativ ist eine andere Möglichkeit, den Zeitstempel zu speichern und den Zeitstempel zu vergleichen – prashant