# Datum util zu Datum sql umwandeln



## Champion1908 (27. Juli 2010)

Liebe Mitglieder!

Tut mir Leid, dass ich gleich wieder ein neues Thema öffne.
Obwohl ich schon viele Foren (inkl. diesem) nach dem Thema durchsucht und auch fündig wurde, helfen diese mir nichts.

Ich habe: 

for(int i=0;i<listDate.size();i++)
{
         long t = listDate.get(i).getTime(): //listDate ist eine ArrayList aus java.util.Date
         erg.add(new java.sql.Date(t));
}

Exception:
Bei der Konvertierung eines char-Datentyps in einen datetime-Datentyp liegt der datetime-Wert außerhalb des gültigen Bereichs.


----------



## Bratkartoffel (27. Juli 2010)

Hallo,

wann / wo wird die Exception geworfen? Poste mal bitte den Stacktrace (Exception.printStacktrace()) Dein Code-Ausschnitt sieht so weit richtig aus.

Gruß
BK


----------



## Champion1908 (27. Juli 2010)

nicht in dieser methode, aber in der, wo ich ein insert statement habe:
ArrayList<java.sql.Date> time = getSQLDates(); //so heißt die obrige Methode

INSERT INTO t_email_monitoring....
...time.get(0) + "', " + "' " + time.get(1)
printStrack() wirft nichts besonderes aus. Sagt das selbe wie die getMessage()


----------



## Bratkartoffel (27. Juli 2010)

Hallo,

lass dir mal bitte die SQL-Anweisung auf der Konsole ausgeben, bevor du sie abschickst. Eventuell ist die toString()-Methode bei der java.sql.Date-Klasse nicht richtig / anders als erwartet überladen.

Gruß
BK


----------



## Champion1908 (27. Juli 2010)

OK, er gibt folgendes zurück:
wenn ich die toString()-Methode aufrufe: 2010-07-26
wenn ich die getTime()-M. aufrufe: 1280171992000
kA: Fehlen da nicht die Stunden, Minuten usw.?

ps: Wie markiere ich ein Thread auf Erledigt?


----------



## Champion1908 (27. Juli 2010)

Vielleicht hilft der ganze code was


```
package connect;
import java.sql.*;
import java.util.ArrayList;
import java.sql.Date;
import javax.swing.JOptionPane;
import java.util.*;
import com.microsoft.sqlserver.jdbc.*;
import com.microsoft.*;
import com.microsoft.sqlserver.*;
import microsoft.sql.*;
/**
 * 
 * @author Champion
 * @version 1.0
 * @since 2010
 * 
 * This class reads the fields out of the Creater and turns them into a mySQL file

 */
public class ToSQL
{
	public ArrayList<Object> list;
	public ArrayList<java.util.Date> listDate;
	/**
	 * Creates a new ToSQL-Object and gets the given creater
	 * @param creater
	 */
	public ToSQL(ArrayList<Object> list, ArrayList<java.util.Date> dates)
	{
		setList(list);
		setListDate(dates);
	}

	public ArrayList<Object> getList() 
	{
		return list;
	}
	
	public ArrayList<java.sql.Date> getSQLDates()
	{
		ArrayList<java.sql.Date> erg = new ArrayList<java.sql.Date>();
		java.sql.Date temp = null;
		for(int i=0;i<listDate.size();i++)
		{
			long t = listDate.get(i).getTime();
			temp = new java.sql.Date(t);
			JOptionPane.showMessageDialog(null, "Temp: " + temp.toString() + "Time: " + temp.getTime());
			erg.add(temp);
		}
		return erg;
	}
	
	public void setList(ArrayList<Object> list) 
	{
		this.list = list;
	}
	
	public ArrayList<java.util.Date> getListDate()
	{
		return listDate;
	}

	public void setListDate(ArrayList<java.util.Date> listDate) 
	{
		this.listDate = listDate;
	}

	public void create()
	{
		ArrayList<java.sql.Date> time = getSQLDates();
		try
		{
			String url = "jdbc:sqlserver://dfs01;instanceName=data;databaseName=Monitoring";//"jdbc:sqlserver://dfvms01\\dataflow:1433"
			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
			Connection conn = DriverManager.getConnection(url, "ba", "klaaxx");
			Statement s = conn.createStatement();
			JOptionPane.showMessageDialog(null, conn.isValid(100));
			s.executeUpdate("INSERT INTO t_email_monitoring (absender, kundenname, modul, datumsent, datumreceived, emailtext, success)" +//da liegt das Problem
					"VALUES " +
					"('" + list.get(6).toString() + "', '" + list.get(1) + "', '" + list.get(2)
					+ "', '" + time.get(0) + "', '" + time.get(1) + "', '" + list.get(3)
					+ "', '" + list.get(0) + "')");
			conn.close();
		}
		catch(SQLException sqle)
		{
			JOptionPane.showMessageDialog(null, "SQLException: " + sqle.getMessage());
			sqle.printStackTrace();
		}
		catch(ClassNotFoundException cnfe)
		{
			JOptionPane.showMessageDialog(null, "Class not found: " + cnfe.getMessage());
			cnfe.printStackTrace();
		}
		catch(Exception ex)
		{
			JOptionPane.showMessageDialog(null, "Exception: " + ex.getMessage());
			ex.printStackTrace();
		}
	} 
}
```


----------



## Anime-Otaku (27. Juli 2010)

Aber dran denken, die Connection/statement/resultset usw. in einem finally Block zu schließen, d.h. die Ressourcen freizugeben.


----------



## Champion1908 (27. Juli 2010)

Connection hab ich im try-block zugemacht, resultset brauch ich keines. Das statement muss man auch schließen?

Schau ich gleich in der API.

Trotzdem weiterhin, wie wandelt man java.util.Datum in java.sql.Datum um?

Danke auf jeden Fall schon für die bisherigen Antworten!


----------



## Champion1908 (27. Juli 2010)

Tatsächlich, statement.close();
Danke für den Hinweis!


----------



## Tim Bureck (27. Juli 2010)

Champion1908 hat gesagt.:


> Trotzdem weiterhin, wie wandelt man java.util.Datum in java.sql.Datum um?



Meines Erachtens sollte


```
java.util.Date date = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(date.getTime());
```

wunderbar funktionieren.


----------



## Erik (27. Juli 2010)

Champion1908 hat gesagt.:


> Trotzdem weiterhin, wie wandelt man java.util.Datum in java.sql.Datum um?




```
java.sql.Date date = new java.sql.Date(java_util_datum.getTime());
```
siehe in der API den Konstruktor

Grüße
Erik

*Hm man sollte mal die Seite aktualisieren bevor man antwortet *


----------



## Champion1908 (27. Juli 2010)

Hallo!

Das ist ja das Problem:

long t = listDate.get(i).getTime(): //listDate ist eine ArrayList aus java.util.Date
erg.add(new java.sql.Date(t));

eigentlich genau das selbe, aber ich bekomm ja immer die Exception:

Bei der Konvertierung eines char-Datentyps in einen datetime-Datentyp liegt der datetime-Wert außerhalb des gültigen Bereichs.


----------



## Anime-Otaku (27. Juli 2010)

Die Fehlermeldung kommt ja vom SQL-Treiber? Sonst wäre sie kaum eingedeutscht^^

Ich hab mal google befragt....
Da war das Problem, dass ein deutschsprachiger (Microsoft)SQL-Server auf einem Englischen Windows läuft.

Und dadurch ein anderes Datumsformat erwartet wird vom SQL-Server.



> Kurzes Datumsformat:
> Hier: TT.MM.JJJJ
> 
> Langes Datumsformat:
> TTTT, T. MMMM JJJJ



Ein Stacktrace wäre natürlich schöner gewesen (package-Namen oder so hätteste ja zensieren können^^)


----------



## Champion1908 (28. Juli 2010)

Das ist einmal ein guter Hinweis!
Danke!


----------



## Champion1908 (28. Juli 2010)

Das java.util.Date gibt mir aber folgendes Format zurück:

Tue Jul 27 05:26:24 CEST 2010

Kann mir jemand sagen, woher dieses "Tuesday"


----------



## Champion1908 (28. Juli 2010)

OK, ich habs

Der entscheidende Hinweis war die Sprache!
Also, ich bin draufgekommen, dass es nicht umbedingt notwendig ist, java.sql.Date zu verwenden, desshalb hab ich dann SimpleDateFormat verwendet. (englischer Server)


```
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-dd-MM HH:mm:ss"); //Achtung auf Groß-Klein Schreibung
arrayList.add(sdf.format(listDate.get(i))); //arrayList<String>
```
Danke für eure Hilfe!

ps: StrackTrace ist bei mir jetzt ein bißchen kompliziert herbeizuzaubern, denn ich führe das Program nicht auf dem Computer aus, auf dem ich programmiere.


----------



## Champion1908 (28. Juli 2010)

Danke, es funktioniert jetzt. Es lag tatsächlich an der Sprache. Man braucht java.sql.Date garnicht


```
SimpleDateFormat sdf = new SimpleDateFormat(yyyy-dd-MM HH:mm:ss); //Groß-Klein Schreibung beachten
erg.add(sdf.format(listDate.get(i)); //erg=ArrayList<String>
```

Danke für eure Hilfe!


----------



## Anime-Otaku (28. Juli 2010)

Ich verstehe immer noch nicht was du eigentlich gemacht hast? Formatierst du eigenhändig die Variablen für den SQL-String? (habs nun gesehen...hatte das wohl übersehen)

Dazu benutzt man normalerweise ein PreparedStatement. Der sollte alles durch den JDBC-Treiber entsprechend formatieren. http://java.sun.com/javase/6/docs/api/java/sql/PreparedStatement.html

Es ist auch performanter(batch inserts/updates) bei häufigeren Aufrufen und schützt vor SQL-Injections.


----------



## Champion1908 (29. Juli 2010)

Von einem Server werden e-mails geholt, diese werden ausgewertet.(Name, Addresse, DatumAbgeschickt, DatumEmpfangen usw.)

Alle diese Felder werden dann in eine sql Datei gespeichert.

mfg
Steve


----------

