PDA

View Full Version : 4 gepackte Felder in ein DATE Feld für SQL Abfrage



cicero22
25-10-07, 08:23
Guten Tag Forum.

In der Hoffnung die Frage wurde nicht schon zu oft gestellt.. (habe allerdings danach gesucht.)

Also - ich habe in einer Datenbank vier gepackte Datums Felder:
TT 2 packed
MM 2 packed
CC 2 packed
JJ 2 packed

Ich möchte diese in EINEM SQL quasi zu einem Date Feld zusammenführen, um direkt darauf Datumsfunktionen wie z.B. - 95 days ausführen zu können. (notfalls auch mit einem Workaround...)

Danke für Eure Hilfe...

dirk

holly
25-10-07, 11:04
Hallo cicero22,

SELECT DATE(
SubStr( Digits(JJ + (1900+cc*100)), 7, 4) !! '-' !!
SubStr( Digits( mm ), 9, 2) !! '-' !!
SubStr( Digits( TT ), 9, 2)) ....

versuchen.
Datfmt sollte dabei auf ISO stehen. cc=0 für 1900 cc=1 für 2000
(wenn in cc 19 oder 20 steht, Formel oben entsprechend anpassen)

Gruss Holger

cicero22
25-10-07, 12:38
Hallo Holger,

danke für die "schnelle Hilfe". Genau mit Deiner Lösung bin ich nicht so recht zum Erfolg gekommen - allerdings war es als Gedankenanstoss super. Habe es nun so gemacht:


SELECT
date(
substr( digits ( TT ), 1, 2 ) !! '.' !!
substr( digits ( MM ), 1, 2 ) !! '.' !!
substr( digits ( JJ + 2000 ), 2, 4 )
)

(extra mal ohne das Jahrhundert)
Und auf *EUR gesellt. Funktioniert!

Danke
dirk

B.Hauser
27-10-07, 16:36
Hallo,

ich würde mir den Substring sparen:



Select Date(Digits(CC) concat Digits(JJ) concat '-' concat
Digits(MM) concat '-' concat Digits(DD))
From ...


Birgitta

Fuerchau
29-10-07, 11:18
Wenn ein Datum im ISO-Format (JJJJ-MM-TT) an die Funktion DATE(...) übergeben wird, ist das aktuelle Datumsformat des Jobs bzw. des Programmes nicht relevant, da das ISO-Format immer erkannt wird.

Ansonsten bist du stark von Umgebungseinstellungen abhängig.

Auch solltest du im ILERPG immer die ISO-Variante wählen, da das interne Format sowieso ISO ist und nur die Darstellung nach außen variiert.

In DSPF/PRTF usw. kann das Format dann durchaus *JOBRUN sein, so dass Sprachumgebungen bzw. Ländereinstellungen automatisch berücksichtigt werden.

B.Hauser
29-10-07, 13:08
SQL erkennt nicht nur das ISO-Format, sondern ALLE gültigen Datumsformate mit einem 4-stelligen Jahr.

Bei dem folgenden Statement werden alle alphanumerischen Strings in ein gültiges Datum konvertiert.



Select Date('2007-10-29'), Date('29.10.2007'), Date('10/29/2007'), Date('2007302')
From SysIbm/SysDummy1


Bei einem 2-stelligen Jahr ist es nicht möglich programmatisch festzustellen an welcher Position das Jahr steht. An dem Trennzeichen kann man sich nicht orientieren, da dies beliebig gewählt werden kann.

Bei embedded SQL sollte das Datums-Format über SET OPTION oder im Compile Command auf eins der 3 gültigen (ISO, USA, EUR) Datumsformate mit 4-stelligem Jahr gesetzt werden.

Der Grund hierfür liegt darin, dass der SQL-Precompiler für jede Hostvariable eine zusätzliche Variable definiert. Bei einem Datumsfeld erhält die Variable das Format, das im SET OPTION-Statement oder im Compile-Command angegeben wurde. Das Format der Host-Variable in den D- oder H-Bestimmungen wird nich berücksichtigt! Wird nun eine solche vom Precompiler definierte Variable mit einem 2-stelligen Datumsformat definiert, kann es bei der Übernahme aus der Host-Variable zu einem Feldüberlauf kommen. Dies passiert nicht, wenn das Datumsformst ein 4-stelliges Jahr hat.

Intern ist das Datum nicht ISO sondern als fortlaufender numerischer Binär-Wert (Scaliger Number) gespeichert.

Birgitta