# DB2: Datum in bestimmtes Format umwandeln?!



## CurlyConny (3. Juli 2008)

Hallo!

Ich bin eine blutige Anfängerin und möchte gerne ein Datum umwandeln.

Folgendes Format habe ich: 

z.B. 31-Dec-2007

In meiner Tabelle steht allerdings das Datumsformat 31.12.2007

Wie kann ich das in einer select-Abfrage beim Vergleich erreichen?
Muss ich die komplette Spalte konvertieren? Wenn ja, wie? Oder gibt es ein einfacher Befehl, mit dem ich das Datum in der Query umwandeln kann?
Hoffe, ihr könnt mir weiterhelfen.

Danke und LG
Conny


----------



## Sphinx-Flash (4. Juli 2008)

Hallo CurlyConny,

mit einer solchen Abfrage haben nicht nur blutige Anfänger Probleme 

Folgende Lösung gibt es für Dein Problem:

SELECT Format(Datum, 'DD-MMM-YYYY') FROM Tabelle;

Du kannst ein Datum auch im SELECT Bereich umformatieren.
Um nun den Monat in Form der ersten drei Buchstaben ausgegeben zu bekommen, musst Du die Formatierung MMM verwenden.

Ich wünsche noch eine geruhsame Nacht und hoffe gut geholfen zu haben.


----------



## CurlyConny (4. Juli 2008)

Hallo!
Danke für die Antwort...werde die Abfrage später mal ausprobieren.
Allerdings muss ich 31-Dec-2007 in 21.12.2007 umwandeln. Aber das müßte ja dann genauso gehen, oder ;-)
Also statt DD-MMM-YYYY in DD.MM.YYYY?!

LG
Conny


----------



## Sphinx-Flash (4. Juli 2008)

Ich hatte es ursprünglich genau anders herum verstanden. 

Genau so müßte es in diesem Fall gehen...


----------



## CurlyConny (4. Juli 2008)

hallo!

leider besteht das problem weiterhin...

ich habe folgende abfrage:

SELECT SUM(sales) FROM sales WHERE sales_date = '31-Dec-2007'

Logischerweise bekomme ich eine Fehlermeldung, weil der Datentyp falsch ist...aber wie kann ich das übergebene Datum (31-Dec-2007) umwandeln?

LG
Conny


----------



## planb2000 (4. Juli 2008)

Hi,

das was Sphinx-Flash schon vorgeschlagen hatte mußt du glaube ich noch anwenden:

```
-- diese query
SELECT SUM(sales) 
FROM sales 
WHERE sales_date = '31-Dec-2007'

-- wird zu 
SELECT 
SUM(sales) FROM sales 
WHERE Format(sales_date, 'DD-MMM-YYYY') sales_date = '31-Dec-2007'
```

Leider kenne ich micht nicht so gut mit DB2 aus, aber du mußt auf jeden Fall in der WHERE bedingung formatieren.

Lieben Gruß


----------



## CurlyConny (4. Juli 2008)

Ok, jetzt habe ich nochmal eine Anfrage gemacht...aber ich bekomme immer noch folgenden Fehler 



> ------------------------------ Eingegebene Befehle ---------------------------
> SELECT SUM(sales) FROM sales WHERE Format(sales_date, 'DD-MMM-YYYY') sales_date = '31-Dec-2007';
> ------------------------------------------------------------------------------
> SELECT SUM(sales) FROM sales WHERE Format(sales_date, 'DD-MMM-YYYY') sales_date = '31-Dec-2007'
> ...


----------



## Sphinx-Flash (4. Juli 2008)

Hallo CurlyConny,

habe eben gesehn, daß Du immer noch verzweifelt versuchst den Code abzufragen. Nu wird allerdings schon deutlicher, worauf Du hinaus willst... lach...

Das Feld sales_date ist ein Datumsfeld oder ein Textfeld?
Ich hoffe es ist ein Datumsfeld... Bei einem Textfeld müßten wir noch die Funktion: Datevalue verwenden... aber ich will Dich jetzt nicht weiter verwirren.

In welcher Programmiersprache willst Du denn die Abfrage starten? In php in VB? 

Der untere SQL-String kann schon mal nicht funktionieren : 

SELECT SUM(sales) FROM sales WHERE Format(sales_date, 'DD-MMM-YYYY') sales_date = '31-Dec-2007';

Das zweite sales_date ist zuviel:

SELECT SUM(sales) FROM sales WHERE Format(sales_date, 'DD-MMM-YYYY')  = '31-Dec-2007';


Normalerweise wird ein Datum in SQL mit folgender Formatierung abgefragt (sofern es sich um ein Datumsfeld handelt:

#mm/dd/yyyy#
Dabei ist es eigentlich unerheblich, wie das Datum in der Datenbank formatiert ist. 
In VB bspw. erreichst Du das folgendermaßen:

WHERE sales_date = " & Format("31.12.2007", "\#mm\/dd\/yyyy\#") & ";"
oder 
WHERE sales_date = #07/04/2008#;


Das bedeutet: Prinzipiell mußt Du das abzufragende Datum SQL konform konvertieren.

Ich hoffe, Dich jetzt nicht weiter verwirrt zu haben.


----------



## CurlyConny (5. Juli 2008)

hallo!
es wird immer verwirrender ;-)

sales_date ist ein datumsfeld...

jetzt habe ich die abfrage wie oben eingegeben und erhalte folgenden fehler:



> ------------------------------ Eingegebene Befehle ---------------------------
> SELECT SUM(sales) FROM sales WHERE Format(sales_date, 'DD-MMM-YYYY') = '31-Dec-2007';
> ------------------------------------------------------------------------------
> SELECT SUM(sales) FROM sales WHERE Format(sales_date, 'DD-MMM-YYYY') = '31-Dec-2007'
> ...



was ist nun wieder falsch?


----------



## Sphinx-Flash (5. Juli 2008)

Ich habe eben gesehen, daß Du IBM DB2 verwendest...

Da kenne ich mich eigentlich auch nicht aus...

Habe aber eben gerade kostenlose cookbooks gefunden:

http://mysite.verizon.net/Graeme_Birchall/id1.html

Habe mir das erste mal angesehn:

Demnach müsstest Du eigentlich nur:

SELECT SUM(sales) FROM sales WHERE sales_date = '2007-12-31'

abfragen.

teste das mal bitte.


----------



## planb2000 (5. Juli 2008)

Hi,

laut referenz, probier mal bitte:


```
SELECT SUM(sales) FROM sales WHERE sales_date = DATE('2007-12-31')
```

Habe ich http://www.mayeruli.de/db2/datum.html gefunden. Sieht mir nach ANSI Standart aus, das sollte klappen. 
Wenn das obere Beispiel nicht klappt poste bitte die Tabellen Definition, also Dein DDL (Data definition language), damit werden Tabellen und Objecte in Datenbanken erzeugt, z.B. CREATE TABLE, GRANT SELECT... etc.

Die Idee von Sphinx-Flash ist gut, geht aber nur wenn Dein Datum als String in der Tabelle abgelegt wurde.

Lieben Gruß


----------



## CurlyConny (5. Juli 2008)

hallo!

beide abfragen funktionieren zwar, allerdings ist das datumsformat falsch...es soll 31-Dec-2007 abgefragt werden!

in der datenbank sample von db2 gibt es die tabelle sales mit der spalte sales_date und dem datentyp date...

ich muss es also irgendwie schaffen, das datum umzuwandeln...habe es mit CHAR(sales_date,xxx) versucht, aber leider gibt es da nur vorgegebene Formate wie z.B. USA; EUR, ISO, LOCAL aber leider kann ich es nicht selbst bestimmen...

ist das wirklich so kompliziert?


----------



## Sphinx-Flash (6. Juli 2008)

Hallo Curlyconny,

ich glaube, es gibt momentan zwei große Probleme bei Deiner Frage:

Zum einen wird es wahrscheinlich wenige geben, die sich mit IBM DB2 sehr gut auskennen. Aber dazu haben wir ja Links gegeben. Dort kann man doch noch einiges nachlesen.

Zum besseren Verständnis: SQL und Datenbanksysteme sind nicht immer gleich. Die häufigsten sind MySQL, Access und Oracle. Zwischen diesen DB-Systemen gibt es schon ganz wesentliche Unterschiede in den SQL-Referenzen. 

Das nächste Problem ist, daß noch immer nicht richtig klar ist, um was es überhaupt geht.

Du hast zuletzt geschrieben, daß die Abfrage, die ich notiert hatte, sowie die von planb2000 funktioniert haben, aber die das Datum anders abgefragt werden soll... 

Wenn doch die Abfrage funktioniert, wieso muss ich dann daran etwas ändern?

Vielleicht kommen wir doch noch zum Ziel: Lach...

Du hast eine DB2 Datenbank!
In dieser DB2 Datenbank ist eine Tabelle sales!
In dieser Tabelle sales gibt es unter anderem die Felder sales und sales_date!
Das Feld sales_date ist als Datum formatiert.

Die Abfrage 
SELECT SUM(sales) FROM sales WHERE sales_date = '2007-12-31'
funktioniert.

Das stimmt soweit alles, hoffe ich: Fragend guck

Gibt diese Abfrage Dir die richtige Summe aus? 

Wenn ja, weiß ich nicht warum das Datum anders formatiert sein soll?

Irgendwie scheine ich auf einem ganz großen Schlauch zu stehen und komme nicht davon runter... :suspekt:


----------



## CurlyConny (6. Juli 2008)

hallo!

du hast das alles richtig verstanden.

die abfrage

SELECT SUM(sales) FROM sales WHERE sales_date = '2007-12-31'

funktioniert zwar und liefert ein ergebnis...aber sie bringt mir nichts, da das datum, das gesucht ist NICHT im format 2007-12-31 übergeben wird, sondern im format 31-dec-2007

ich erhalte bei folgender abfrage einen fehler:
 SELECT SUM(sales) FROM sales WHERE sales_date = '31-Dec-2007'

weil ich ein datum mit einem string vergleiche...d.h. 31-Dec-2007 muss in ein datumsformat umgewandelt werden...und genau das ist mein problem...ich weiß nicht wie


----------



## Sphinx-Flash (6. Juli 2008)

Planb2000 hatte doch diese Date Funktion angeschnitten... das t auch nicht?

SELECT SUM(sales) FROM sales WHERE sales_date = Date('31-Dec-2007')

oder daß Du bereits vor dem SQL String in Deiner Programmiersprache das Datumsformat entsprechend umwandeln kannst? Oder läuft die gesamte Programmierung in DB2?


----------



## CurlyConny (6. Juli 2008)

bei dieser abfrage erhalte ich folgende fehlermeldung:

------------------------------ Eingegebene Befehle ---------------------------
SELECT SUM(sales) FROM sales WHERE sales_date = Date('31-Dec-2007');
------------------------------------------------------------------------------
SELECT SUM(sales) FROM sales WHERE sales_date = Date('31-Dec-2007')
SQL0180N  Die Syntax der Darstellung eines Datums-/Zeitwerts als Zeichenfolge 
ist falsch.  SQLSTATE=22007

SQL0180N  Die Syntax der Darstellung eines Datums-/Zeitwerts als Zeichenfolge ist falsch.

Erläuterung: 

Die Zeichenfolgendarstellung eines Datums-, Zeit- oder Zeitmarkenwerts
stimmt nicht mit der Syntax des angegebenen oder implizierten Datentyps
überein.

Die Anweisung kann nicht verarbeitet werden.

Benutzeraktion: 

Stellen Sie sicher, dass die Syntax des Datums-, Zeit- oder
Zeitmarkenwerts der Syntax des betreffenden Datentyps entspricht. Ist
die Zeichenfolge nicht als Datums-, Zeit- oder Zeitmarkenwert gedacht,
achten Sie bei ihrer Verwendung darauf, dass kein solcher Datentyp
impliziert wird.

Benutzer föderierter Systeme: Der Fehler ist möglicherweise auf ein
Problem bei der Datums- bzw. Zeitdarstellung der Datenquelle
zurückzuführen. Falls es sich um eine unbekannte Ursache handelt,
stellen Sie fest, in welcher Datenquelle die Anforderung fehlgeschlagen
ist (die Vorgehensweise wird im Handbuch 'Fehlerbehebung' beschrieben),
und prüfen Sie die Einschränkungen für die Datums- bzw. Zeitdarstellung
der betreffenden Datenquelle.

sqlcode: -180

sqlstate: 22007


----------



## Sphinx-Flash (6. Juli 2008)

Dachte ich mir schon fast... :suspekt:

Deshalb die nächste Frage: 
Wo steht der SQL Befehl?
Ist das innerhalb der DB2?
Oder greifst Du mit einer externen Sprache auf die DB zu?
Wenn ja, welche Sprache?
Wenn nein:
Ist das nur ein Abfrage-Formular innerhalb der DB2
oder ist es innerhalb der DBA-Skriptsprache?
Wenn ja, dann müßte man prüfen, wie man in der DBA-Skriptsprache das Datum passend für den SQL String umformatiert und dann den SQL String mit der Datumsvariablen verknüpft.

Ich vermute nämlich, daß es innerhalb des SQL-Strings für Dein Datumsformat keine Möglichkeit in DB2 gibt. Deshalb meine Befürchtung: das Datum wird vorher schon umformatiert werden müssen.


----------

