# sql Statement



## tsaG (29. Jul 2012)

Hallo, 

ich bin am verzweifeln mit meinem sql statement...


```
java.sql.ResultSet r3 = s3.executeQuery("Select  count(*) from Tabelle1 where Datum between '"+jTextField1.getText()+"' and '"+jTextField2.getText()+"'and Bezug = 'Markt1'");
```


Meine Datenbank hat 2 Spalten, Datum und Bezug.
Jetzt moechte ich durch zwei Textfelder siehe select die häufigkeit von Markt1 innerhalb diesen gewählten Zeitraums wiedergegeben haben. Der obige Select bringt mir zwar eine Zahl, jedoch stimmt diese nicht mit dem tatsächlichen Wert überein.

Hat jemand hierfür eventuell einen tipp?


----------



## Fab1 (29. Jul 2012)

In welchem Format wird denn das Datum übergeben? Ansonsten teste mal "yyyy-MM-dd" z.B. "2012-01-01"

Was anderes fällt mir momentan auch nicht ein.


----------



## Camino (29. Jul 2012)

Was für ein Wert kommt denn raus? Kannst du da irgendwas erkennen, was zusammengezählt wurde? Kommt immer der gleiche Wert raus, egal, was für eine Datumsspanne eingegeben wird?

Was mir aufgefallen ist (keine Ahnung, ob das fehlerhaft ist)

```
"+jTextField2.getText()+"'and Bezug
```
Ich würde zwischen dem ' und dem and ein Leerzeichen machen.

Ansonsten fällt mir nur ein, mal schauen, in welchem Format das Datum in der Datenbank steht und ob das mit den Strings aus den Textfeldern übereinstimmt.


----------



## turtle (29. Jul 2012)

Ich würde den Befehl in einem SQL Client (z.B. Squirrel) probieren und schauen, was da raus kommt. Ausserdem hast Du wohl noch nicht erwähnt um welche Datenbank es sich handelt.


```
Select Datum, Bezug from Tabelle1 where Datum between '<Datum1>' and '<Datum2>' and Bezug = 'Markt1'
```


----------



## tsaG (29. Jul 2012)

Es handelt sich hierbei um eine simple Access Datenbank.

Was ich rausfand ist, dass wenn die Zeitspanne z.B. von 28.07.2012 bis 28.07.2012 ist er den richtigen wert wiedergibt. Jedoch wenn ich von 28.07.2012 bis 29.07.2012 aufrufen will, gibt er mir falsche Werte.


----------



## Camino (29. Jul 2012)

Was heisst falsche Werte? Wieviele Datensätze sollten gezählt werden und wieviele werden tatsächlich angegeben? Hast du dir mal ein Datum ausgeben lassen, um das Format zu überprüfen? Du könntest anstatt des count auch mal alle Datensätze (Datum, Bezug) abfragen und anzeigen lassen, vielleicht lässt sich dann genauer schauen, was der SQL-Befehl findet und wo der Fehler liegt.


----------



## tsaG (29. Jul 2012)

Das Problem erkläre ich mir folgendermassen: In diesem Projekt sind anscheinend alle Datumswerte in der Datenbank als String (Textformat) in der AccessDatenbank gespeichert. Kann es sein, dass er somit nichts mit dem Between anfangen kann, da er ja eig. nicht weiss, dass das ein Datum ist? 

In der Datenbank kann ich das Format umstellen. 

In welches Format muss ich dann nun den Text aus dem Textfeld umformatieren?
Wenn ich den String im Textfeld lass und die generierung starte geht er mir in meinen Exception block.


----------



## Camino (29. Jul 2012)

tsaG hat gesagt.:


> Das Problem erkläre ich mir folgendermassen: In diesem Projekt sind anscheinend alle Datumswerte in der Datenbank als String (Textformat) in der AccessDatenbank gespeichert. Kann es sein, dass er somit nichts mit dem Between anfangen kann, da er ja eig. nicht weiss, dass das ein Datum ist?



Ja vermutlich, das hört sich auf jeden Fall plausibel an...



> In der Datenbank kann ich das Format umstellen.



Wie umstellen? Nachträglich den Typ der Spalte ändern? Oder das Ausgabeformat ändern? Vermutlich gibt es auch eine Möglichkeit in deinem SQL den String in ein Datum umzuwandeln. Musst du vielleicht mal im Internet nach Lösungen suchen. Hab bei Google 
	
	
	
	





```
access datum string vergleichen
```
 eingegeben und es kamen da gleich ein paar Seiten, die sich nach ähnlichem Problem angehört hatten.


----------



## tsaG (29. Jul 2012)

ich hab nun mal versucht meine Eingaben in das Textfeld in ein Datum umzuwandeln mein Code sieht folgendermassen aus:


```
String str_date=jTextField1.getText();
                     DateFormat formatter ; 
                     Date date ; 
                      formatter = new SimpleDateFormat("dd.MM.yyyy");
                      date = (Date)formatter.parse(str_date);  
                     


try{
                java.sql.Statement s = conn.createStatement();
                java.sql.ResultSet r = s.executeQuery("Select  count(*) from Abfrage1 where Ausdr1 between '"+date+"' and '"+date1+"' and Bezug = 'Markt1'");
                while (r.next()) {
                    String str45 = r.getString(1);
                   Table5.getModel().setValueAt(new Integer(str45),1,1);
               }
               }catch (Exception e){      
                    
            }
```


Zudem habe ich in der Access Datenbank die als String gespeicherten Datumsangaben mit einer Abfrage durch die Funktion Datwert in ein Datum (Datentyp) umgewandelt. 

Die Datumswerte sind anscheinend nicht miteinander vergleichbar. Er bringt mir immer als Wert 0....


----------



## mla.rue (30. Jul 2012)

Datenbanken haben zig MÖglichkeiten ein Datum zu formatieren (big, middle, litlte endian, jahr vierstellig, vorangestellte 0 bei einstelligen Tagen/Monaten). Wenn du es bei der "konvertierung" von Zeichenkette zu Datumtyp nicht explizit angibst, musst du schauen, was Access per default macht.

Ich habe mir angewöhnt Datum als int zu speichern in dem Format yyyymmdd, das haut dann immer hin und ich muss mir keine Gedanken über eventuelle Einstellungen der DB bzw OS machen.


----------

