# Fehlermeldung bei SQL Abfrage



## Nathy (18. Dez 2006)

Hallo

Ich habe einen SQL Server. Wenn ich dort folgende Abfrage eingebe, funktioniert es. Wenn ich jedoch aus einem Java Programm die Abfrage eingebe, kommt folgende Fehlermeldung:
The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.

Die ist die Abfrage: Select * from Messages where Time between '2006-12-10' AND '2006-12-13';

Warum das?

Gruss und danke


----------



## bronks (18. Dez 2006)

Ist es der von SQL Server von Microsoft?

Wo hast Du die Abfrage eingegeben?


----------



## Nathy (18. Dez 2006)

Ja ist von Microsoft. Habe sie direkt im SQL Server Management Studio eingegeben und dort funktionierts. Von Java aus aber nicht. Andere Abfragen (ohne Datum) funktionieren von Java aus.

Gruss


----------



## bronks (18. Dez 2006)

Das Problem liegt darin, daß der SQL-Server die Localies verwendet, die in der Systemsteuerung eingestellt sind. Im QueryAnalyzer wird ein Datum in 'yyyy-mm-tt' ausgegeben. Im Enterprisemanager, wieder so, wie die Localies eingestellt sind. Also etwas chaotisch.  Standard ist: 'mm/tt/yyyy'

Meine Empfehlung: PreparedStatement und javax.sql.Date verwenden. Nur so hat man volle Kompatibilität und ist von allen Localies unabhängig.


----------



## Nathy (18. Dez 2006)

Danke für die Antwort.

Ich habe es jetzt mit PreparedStatement gemacht. Wo ist dort der Vorteil?
Gibt es irgendwo ein Beispiel für javax.sql.Date

Gruss


----------



## bronks (18. Dez 2006)

Der Vorteil liegt hauptsächlich darin, daß Datum-/Zeitangaben und Texte mit Sonderzeichen vom JDBC-Treiber automatisch konvertiert und escaped werden.  Sehr nett ist auch, daß man dem PreparedStatement ganze Objekte übergeben kann. Von großer Bedeutung ist das wenn man Daten  in die DB schreibt. 

Bei manchen Datenbanken erhält man durch PreparedStatement Performancevorteile und bei manchen tritt genau das Gegenteil ein. Im speziellen muß man das im Profiler analysieren.

Du erstellst einfach ein javax.sql.Date aus den Milisekunden Deines geparsten DatumString. Dieses übergibst Du dann an die Map des PreparedStatement.


----------

