[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Feb 2007
    Beiträge
    68

    4 gepackte Felder in ein DATE Feld für SQL Abfrage

    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

  2. #2
    Registriert seit
    Jul 2002
    Beiträge
    151
    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

  3. #3
    Registriert seit
    Feb 2007
    Beiträge
    68
    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

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.875
    Hallo,

    ich würde mir den Substring sparen:

    PHP-Code:
    Select Date(Digits(CCconcat Digits(JJconcat '-' concat
                Digits
    (MMconcat '-' concat Digits(DD))
    From ... 
    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.245
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.875
    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.

    PHP-Code:
    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
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

Similar Threads

  1. per SQL Feld ändern...
    By svente in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 23-01-07, 09:49
  2. sql num. Feld formatieren
    By rr2001 in forum IBM i Hauptforum
    Antworten: 9
    Letzter Beitrag: 11-07-06, 14:10
  3. Einfache Abfrage in COBOL/400 mit EXEC SQL
    By AS400-Anfänger in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 27-06-06, 13:18
  4. Abfrage nach <> Ziffern in SQL
    By behmer in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 29-05-06, 12:52
  5. sql abfrage
    By steven_r in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 17-05-06, 15:49

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •