[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Oct 2003
    Beiträge
    117

    [SQL] Numerisch in TIME

    Habe folgendes Problem:

    Ich lese ein 6-stelliges numerisches Feld einer PF ein, und will es per SQL in ein Time-Feld einer SQL-Tabelle ausgeben.

    Code:
    Insert into ... 
    select ... 
    TIME(
    SUBSTR(CHAR(TimeNum), 1, 2) || ':' || SUBSTR(CHAR(TimeNum), 3, 2) ||':'|| 
    SUBSTR(CHAR(TimeNum), 5, 2)) ...
    ...funktioniert, solange alle sechs Stellen gefüllt sind, also ab 10 Uhr (100000). Uhrzeiten vor 10 Uhr (z.B. 95900) werden nicht umgesetzt, da die CHAR-Anweisung aus der führenden Null ein *blank macht.

    Wie kann ich die SQL-Anweisung mehr oder weniger elegant erweitern, dass auch 5-stellige Uhrzeiten umgesetzt werden? Jemand eine Idee?

  2. #2
    Registriert seit
    Oct 2003
    Beiträge
    117
    Danke, habe die Lösung gefunden:

    Code:
    ...
    (case when TimeNum >= 100000 then 
      TIME(SUBSTR(CHAR(TimeNum), 1, 2) || ':' || SUBSTR(CHAR(TimeNum), 3, 2) ||':'|| SUBSTR(CHAR(TimeNum), 5, 2))
     else 
      TIME('0' || SUBSTR(CHAR(TimeNum), 1, 1) || ':' || SUBSTR(CHAR(TimeNum), 2, 2) ||':'|| SUBSTR(CHAR(TimeNum), 4, 2)) 
    end)
    ...
    Aber vielleicht kennt ja jemand eine elegantere Lösung?

  3. #3
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    geht schief für 00:03:07
    richtiger wäre in jedem Fall 1000000 auf TimeNum draufaddieren und dann die erste (jetzt immer echte Stelle) weglassen bei dem Substring Gedöns.

    D*B

    Zitat Zitat von Allrounder Beitrag anzeigen
    Danke, habe die Lösung gefunden:

    Code:
    ...
    (case when TimeNum >= 100000 then 
      TIME(SUBSTR(CHAR(TimeNum), 1, 2) || ':' || SUBSTR(CHAR(TimeNum), 3, 2) ||':'|| SUBSTR(CHAR(TimeNum), 5, 2))
     else 
      TIME('0' || SUBSTR(CHAR(TimeNum), 1, 1) || ':' || SUBSTR(CHAR(TimeNum), 2, 2) ||':'|| SUBSTR(CHAR(TimeNum), 4, 2)) 
    end)
    ...
    Aber vielleicht kennt ja jemand eine elegantere Lösung?
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  4. #4
    Registriert seit
    Oct 2003
    Beiträge
    117
    Zitat Zitat von BenderD Beitrag anzeigen
    geht schief für 00:03:07
    richtiger wäre in jedem Fall 1000000 auf TimeNum draufaddieren und dann die erste (jetzt immer echte Stelle) weglassen bei dem Substring Gedöns.

    D*B
    Stimmt, habe ich nicht bedacht.
    Das vorherige aufaddieren ist eine gute Lösung, dann kann ich mir auch das Case-Geraffel sparen :-).

    Danke

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    wie wärs einfach mit

    Insert into ...
    select ...
    TIME(
    SUBSTR(DIGITS(TimeNum), 1, 2) || ':' || SUBSTR(DIGITS(TimeNum), 3, 2) ||':'||
    SUBSTR(DIGITS(TimeNum), 5, 2)) ...
    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.928
    Hallo,

    CHAR richtet linksbündig aus!
    Einfacher geht es mit DIGITS. Außerdem sollte || oder !! vermieden werden, da beides nicht international ist. Stattdessen sollte concat verwendet werden:

    PHP-Code:
    Select time(substr(digits(ZeitNum), 12concat '.' concat
                substr
    (digits(ZeitNum), 32concat '.' concat
                substr
    (digits(ZeitNum), 52))
    from x 
    Eine andere Version wäre:
    PHP-Code:
    Select time('00010101' concat Digits(ZeitNum))
    from x 
    Birgitta
    Birgitta Hauser

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

  7. #7
    Registriert seit
    Oct 2003
    Beiträge
    117
    Danke für die vielen, gewohnt schnellen Antworten.

    Zitat Zitat von B.Hauser Beitrag anzeigen
    ...
    Eine andere Version wäre:
    PHP-Code:
    Select time('00010101' concat Digits(ZeitNum))
    from x 
    Birgitta
    Gefällt mir am besten und funktioniert auch noch :-).
    Leider verstehe ich die Anweisung nicht. Was hat es mit '00010101' auf sich?

    LG Allrounder

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Das ist ein Datum: 1.1.0001
    Durch diese Anweisung wird ein Timestamp erstellt, aus dem TIME() halt nur den Zeitanteil entnimmt.
    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

  9. #9
    Registriert seit
    Oct 2003
    Beiträge
    117
    Danke, jetzt ist alles klar.

    Schöne Lösung, Birgitta.

Similar Threads

  1. Datenkonvertierung numerisch gepackt nach character
    By chrhe in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 01-11-06, 14:55
  2. OPNQRYF im MAPFLD umsetzung numerisch zu Alpha (Digits)
    By labm in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 23-03-06, 11:17
  3. Gesco Software: *C/S Time – Innovative Zeiterfassung!
    By Kirsten Steer in forum Archiv NEWSblibs
    Antworten: 0
    Letzter Beitrag: 25-11-05, 07:21
  4. DDS alpha in numerisch
    By Tobse77 in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 23-06-05, 10:20
  5. Same Time Lotus Notes
    By GEA in forum NEWSboard Server Software
    Antworten: 0
    Letzter Beitrag: 02-12-04, 15:24

Berechtigungen

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