[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Mar 2009
    Beiträge
    7

    DATE-Wert aus vier INT Werten JH, JJ, MM, TT

    Hallo zusammen,

    das verwendete WWS (nicht von uns) hat immer lustige vier Ganzzahlen Jahrhundert, Jahr, Monat, Tag.

    Man kann das ganze nun in einen Date Wert umrechnen:
    DATE(CAST(G1JHTB*100+G1JJTB as CHAR(4))||'-'||G1MMTB||'-'||G1TTTB)

    Es tut, ich finds aber häßlich.

    Daher die Frage:
    Geht das irgendwie auch schicker?

    Eventuell so in der Richtung: datexy(year, month, day).

    Vielen Dank für alle Hinweise.

    Michael Haufler

    scireum GmbH - http://www.scireum.de

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Es gibt schon andere Methoden, aber ob die unbedingt schicker sind?!
    Aktuell kann SQL nur gültige alphanumerische Darstellungen eines Datums oder Zeitmarke konvertieren. Sofern SQL ein numerisches Datum konvertieren soll muss dieses (zumindest unter 7.1) der rechnerischen Anzahl der Tage seit dem 01.01.0001 entsprechen.

    Die folgende Lösung könnte vielleicht etwas einfacher sein (allerdings nur wenn die Spalten gepackt oder gezont 2, 0 definiert sind. Sollte es sich um echte Integer-Werte handeln, müssen die numerischen Werte gecastet werden:
    Code:
    Date(Digits(G1JHTB) concat Digits(G1JJTB) concat 
         Digits(G1MMTB) concat Digits(G1TTTB) concat '000000')
    Code:
    Date(Right(Digits(G1JHTB), 2) concat Right(Digits(G1JJTB), 2) concat 
         Right(Digits(G1MMTB), 2) concat Right(Digits(G1TTTB), 2) concat '000000')

    Um das ganze zu vereinfachen, kannst Du auch eine UTF (user defined function) schreiben und diese ausführen. Der Vorteil bei UDFs Du kannst fehlerhafte Daten abfangen.
    Etwa so:
    Code:
    Create Function YOURSCHEMA/CVTHJMD2DT 
          (ParJHD Decimal(2, 0) , 
           ParJJ  Decimal(2, 0) ,
           ParMM  Decimal(2, 0) , 
           ParTT  Decimal(2, 0) )
       Returns Date
       Language SQL
    
    Begin 
       Declare Continue Handler for SQLSTATE '22007'
               Return Date('0001-01-01');
       Return Date(Digits(ParJHD) concat Digits(ParJJ) concat 
                   Digits(ParMM)  concat Digits(ParTT) concat '000000');
    End;
    Aufruf der UDF:
    Code:
    Select CVTHJMD2DT(G1JHTB, G1JJTB, G1MMTB, G1TTTB)
    From YourTable;
    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

  3. #3
    Registriert seit
    Jan 2007
    Beiträge
    905
    So als Beifang aus dem Netz...

    SELECT CAST(CAST(G1JHTB + 19000000 AS VARCHAR) AS DATETIME)
    (ungeprüft und ohne Garantie)

    in RPG würd's dann so aussehen:
    dcl-s ISODATE Date(*ISO)
    ISODATE = %Date(G1JHTB: *CYMD)
    kf

  4. #4
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... kommt drauf an was man unter chic versteht. Für mich wäre chic, wenn die Tabellen ein Datumsfeld verwenden, wenn ein Datum gespeichert werden soll.
    Das zweit chicste wäre, wenn es jeweils eine View gäbe, die mir diesen Unfug vom Hals hält, wie die View das macht, könnte mir dann egal sein, wenn es denn stimmt, wenig Strom kostet und schnell ist.

    Die UDF Lösung sieht dafür auf den ersten Blick sehr schön aus, hat aber einen wesentlichen Haken, das ist nicht schnell und kostet viel Strom, weil es mir viele Table Scans einbringt, wenn die Datumsfelder in where und/oder join Klauseln verwendet werden. Deshalb würde ich da eher eine zusätzliche Translation table vorsehen, die hat ein richtiges Datum als Keyfeld und dann die vier Ganzzahlen als columns (zusätzlich kann die noch Felder für Ultimo, Quartal, Eier Woche haben); selbige muss natürlich für alle vorkommenden Daten gefüllt sein. Letzteres hört sich kompliziert an, aber wenn ich dir für 100 Jahre mit allen Daten fülle sind das < 40.000 Sätze und dürfte für die meisten kommerziellen Anwendungen reichen.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

Similar Threads

  1. SQL CAST als Datum bei fehlerhaften Werten
    By Moonwalker in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 15-12-13, 15:23
  2. CPW-Wert Prozessor Feature
    By Frank Hildebrandt in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 01-04-03, 11:43
  3. Typ DATE in SQL-Tabelle
    By Melanie in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 13-02-03, 10:30
  4. Datei mit Hex-Werten in RPG verarbeiten
    By DiBagger in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 13-09-02, 12:41
  5. ASCII Wert für Datenfreigabe
    By EDV-NEW-MEDIA in forum IBM i Hauptforum
    Antworten: 0
    Letzter Beitrag: 09-04-02, 11:40

Tags for this Thread

Berechtigungen

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