PDA

View Full Version : SQL TO_DATE(CHAR(CAST



oulbrich
07-12-15, 13:32
Hallo

ich habe ein Problem mit folgender SQL Anweisung:



Select
year(TO_DATE(CHAR(CAST(num80 AS DECIMAL(8,0))), 'YYYYMMDD')) as Jahr,
month(TO_DATE(CHAR(CAST(num80 AS DECIMAL(8,0))), 'YYYYMMDD')) as Monat
from bibliothkek.daten


führe ich diese Anweisung in IBM DataStudio oder SQuirrel läuft alles einwandfrei.

Lasse ich die Anweisung über den GreenSrcren oder als Embedded SQL im RPG laufen kommt es zu einem Fehler.


Token ( ungültig. Gültige Token: )
year(TO_DATE(CHAR(CAST(num80 AS DECIMAL(8,0))), 'YYYYMMDD')) as Jahr,
month(TO_DATE(CHAR(CAST(num80 AS DECIMAL(8,0))), 'YYYYMMDD')) as Monat
from bibliothkek.daten


es wird die dritte 5 Klammer direkt nach DECIMAL angemeckert.

year(TO_DATE(CHAR(CAST(num80 AS DECIMAL(8,0)))

Hat da jemand eine Erklärung oder eine besser Vorgehensweise wie man aus einem 8 Stellig nummerischem Feld, welches ein Datum enthält, Jahr, Monat und Tag extrahiert?


Bin für jede Antwort dankbar.

oulbrich

Fuerchau
07-12-15, 14:51
Grund ist das Dezimalkomma!
Mach ein Leerzeichen vor oder nach dem Komma da sonst der Wert als 8,0 und nicht als 2 Werte interpretiert wird.
Wobei mir der Cast als überflüssig erscheint.

oulbrich
08-12-15, 06:15
Hat geklappt. Besten Dank. Die Cast Funktion brauche ich um aus dem Num80 Feld ein CHAR zu erstellen da die TO_DATE Funktion nur mit CHAR Daten funktioniert.

B.Hauser
08-12-15, 06:30
Wenn das Datum als numerisches Datum definiert ist, warum zunächst in eine Zeitmarke konvertieren, um dann daraus das Jahr zu ermitteln?

Hier einige einfachere Möglichkeiten (vorausgesetzt, das numerische Datum ist 8,0 definiert):

Substr(Digits(Datum), 1, 4)
Year(Digits(Datum) concat '000000')
Int(Datum/10000)
Left(Digits(Datum), 4)



Die letzten beiden Variante klappen nur für das Jahr.

Birgitta

Fuerchau
08-12-15, 11:51
Der CAST(NUM as DECIMAL...) ist Blödsinn, da ein CHAR(NUM) das selbe Ergebnis liefert wie ein CHAR(DEC).
DIGITS ist die Sonderform von CHAR und liefert nur die Zahlen, kein Vorzeichen, kein Dezimalkomma/-punkt und immer mit Vornullen, während CHAR eine "Zahlaufbereitung" vornimmt.