# to_Date Oracle



## Kenan89 (25. Jan 2012)

Hallo ich habe eine Frage bzgl. der to_date Funktion in Oracle.
Standard Format in Oracle ist, falls ich richtig nachgeschaut habe: 
	
	
	
	





```
'yyyy-mm-dd hh24:mi:ss'
```

Jetzt habe ich 3 Strings: Tag, Monat, Jahr die ich in einen String kombiniere:


```
String Tag = 01;
String Monat = Februar;
String Jahr = 2001;
String Datum = Tag+". "+Monat+" "+Jahr;
```

Diese will ich in die Datenbank einfügen und muss sie natürlich formatieren. mit 

```
to_date(Datum, 'yyyy-mm-dd hh24:mi:ss');
```
beim insert-Code.

Meine Frage ist erstens, ist das wirklich der Default-Date Format von Oracle? 
Zweite Frage ist, wie Java das to_date ausführen will, den in meinem String Datum fehlen Uhrzeitangaben, die für den Default-Date Format wichtig sind.


----------



## irgendjemand2 (25. Jan 2012)

nutze einfach vorhandene datentypen aus dem sql-pack : Date , Time , Timestamp


----------



## SlaterB (25. Jan 2012)

ansonsten geht sicherlich auch 'yyyy-mm-dd' als Format bzw. mit - und . als Trenner musst du dich eh noch abstimmen,
die Reihenfolge Jahr, Monat, Tag ist auch nicht zum Spass da, wenn du es anders übergeben willst, dann formuliere das Pattern passend..,
ach und dann muss Monat auch noch ne Zahl sein, mit deutschem Text würde es Oracle eh schwer haben,
da kommt ja wirklich ne Menge zusammen

Variablennamen unbedingt klein schreiben


----------



## Kenan89 (25. Jan 2012)

Ich habe das jetzt so gemacht:


```
String Datum = Tag+". "+Monat+" "+Jahr; //Ausgabebeispiel: 03. Februar  2010
to_date(Datum, 'd. MMMM yyyy');
```

Das sind nur die relevanten Codeschnipsel. Eclipse sagt mir: Invalid character constant

EDIT: Code etwas umschrieben: 

```
String Datum = Tag+". "+Monat+" "+Jahr; //Ausgabebeispiel: 03. Februar  2010
to_date(Datum, "d. MMMM yyyy");
```
Jetzt sagt Eclipse: The method to_date(String, String) is undefined for the type JavaTestKlasse


----------



## KrokoDiehl (25. Jan 2012)

> Meine Frage ist erstens, ist das wirklich der Default-Date Format von Oracle?
> Zweite Frage ist, wie Java das to_date ausführen will, den in meinem String Datum fehlen Uhrzeitangaben, die für den Default-Date Format wichtig sind.



Zur ersten: Ich gehe davon aus dass das Standarddatum von Oracle auch mit den Einstellungen von Zeitzone (Locale im Allgemeinen) zutun hat. Zumindest halte ich es für gefährlich so etwas hardzukodieren.

Zur zweiten: In der to_date()-Funktion von Oracle gibst du dein Format ja schon an. Also unabhängig vom internen Format von Oracle kannst hier angeben wie du deinen String formatiert hast und natürlich Minuten u.ä. weglassen, z.B. also

```
to_date('24.12.2011', 'dd.mm.yyyy')
```


----------



## HoaX (25. Jan 2012)

Kenan89 hat gesagt.:


> Ich habe das jetzt so gemacht:
> 
> 
> ```
> ...



Kann es sein dass du den Code wirklich exakt so im Eclipse stehen hast? to_date ist eine Methode der Datenbank, die wird a) Java nicht kenne, und b) ' definiert einen Char, klar dass da gemeckert wird, wenn da ein String kommt.


----------



## SlaterB (25. Jan 2012)

> Eclipse sagt mir: Invalid character constant 

[c]to_date(Datum, 'd. MMMM yyyy');[/c]
kann man auch nicht direkt in den Quellcode schreiben, oder was soll dann deiner Meinung nach passieren?
das kann korrekt verwendet irgendwann mal Teil eines SQL-Strings für eine Oracle-Datenbank-Abfrage sein, 
aber bis dahin ist es ein langer langer Weg wenn du diesen Fehler nicht selber erkennst


----------



## Kenan89 (25. Jan 2012)

Danke für die Antwort aber das klappt leider nicht.
Ich habe folgendes testweise mal ohne Stringvariable versucht:

```
to_date("01. Februar 1997", "d. MMMM yyyy");
```
Leider spuckt er eine Fehlermeldung aus: 
The method to_date(String, String) is undefined for the type JavaTestKlasse


----------



## SlaterB (25. Jan 2012)

was erwartest du überhaupt?? was soll denn passieren?

> Zweite Frage ist, wie Java das to_date ausführen wil

das ist wirklich ne Frage, mehr als diese Fehlermeldung kannst du nicht erwarten,
Oracle ist hier eine Datenbank, nicht der Java-Hersteller neuerdings


----------



## Kenan89 (25. Jan 2012)

Okay, aber irgendwie muss es mir möglich sein, to_date einen String mitzugeben. Schließlich weiss
ich ja nicht, was der User später für ein Datum eingeben wird.
Da to_date eine SQL Methode ist, denke ich, dass Sie in den execute Bereich gehört.

Nun schaut mein executeUpdate so aus:

```
executeUpdate("VorName1', 'Vorname2', to_date(geburtsdatum, 'd. MMMM yyyy')");
```

Jetzt wird die to_date Methode ausgeführt. Leider erhalte ich seitens Eclipse zwar keine Fehlermeldung, aber es kann jetzt wegen diesem to_date nicht auf die Tabelle zugegriffen werden.


----------



## DerFeivel (25. Jan 2012)

Kenan89 hat gesagt.:


> Danke für die Antwort aber das klappt leider nicht.
> Ich habe folgendes testweise mal ohne Stringvariable versucht:
> 
> ```
> ...



Also du übergibst der to_date-Funktion schonmal den falschen Format-String im zweiten Parameter:

Guck mal hier:

Oracle Dates and Times

Wenn dann muss es 
	
	
	
	





```
to_date("01. Februar 1997","dd. Month yyyy")
```
heißen, da du den vollständigen Monatsnamen angibst. Zudem ist für den Tag des Monats immer dd anzugeben (soweit ich das gerade in Erinnerung habe)


----------



## DerFeivel (25. Jan 2012)

Kenan89 hat gesagt.:


> Okay, aber irgendwie muss es mir möglich sein, to_date einen String mitzugeben. Schließlich weiss
> ich ja nicht, was der User später für ein Datum eingeben wird.
> Da to_date eine SQL Methode ist, denke ich, dass Sie in den execute Bereich gehört.
> 
> ...




```
executeUpdate("VorName1', 'Vorname2', to_date("+Datum+", 'dd. Month yyyy')");
```

Wenn Datum die String-Variable aus dem Initial-Beitrag ist.


Tante Edith sagt auch:  Volle Monatsnamen auf englisch...


----------



## Kenan89 (25. Jan 2012)

Danke deine Antwort war sehr hilfreich.
Ich muss wohl in die MySql Formatregeln geschaut haben.
Laut deinem Link müsste jetzt die execute-Zeile so aussehen:


```
...'Nachname1',to_date("+geb_datum+", 'DD. MONTH YYYY'));
```

DD = Monatstag(zweistellig?)
MONTH = Monat, ausgeschrieben
YYYY = Jahr, 4-stellig

Trotzdem kann man nicht auf die Tabelle zugreifen.


----------



## DerFeivel (25. Jan 2012)

Poste mal bitte deinen gesamten, relevanten Quelltext:


die executeUpdate-Methode (die ich vermute, dass du sie benutzt) von java.sql.Statement erwartet ein vollständiges SQLQuery und nicht nur irgendwelche Werte. 

(bei meinem vorherigen Post war ich da wohl etwas unachtsam)


----------



## SlaterB (25. Jan 2012)

'zugreifen' ist komische Sprache, zumindest für exakte Fehlerbeschreibung

fange mit
executeUpdate("huhu");
ab, 
das sollte eine deftige Fehlermeldung geben, bevor du die nicht mit StackTrace usw. erhälst kannst du andere komplizierte Dinge nicht wirklich angehen

-------

mit String-Variablen usw. musst du vorerst auch nicht unnötige Komplexität reinbringen, 
teste vorerst maximal komplett feste Werte a la
to_date('01. January 2012', 'DD. MONTH YYYY')

möglichst parallel auch in einem normalen DB-Tool statt Java


----------

