[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Sep 2002
    Beiträge
    61

    Question Datenart von Zeitfeld

    hi *all,

    ich habe in einem PF ein Feld mit der Datenart Z, also ein Feld für Zeitmarkendaten. In dieses Feld kommt die aktuelle Zeit bei einem drücken von ENTER. Kann mir jemand sagen welches Format dieses Feld dann hat (nummeric, char, ...)?
    Ich habe nämlich das Problem das ich kein *blanks und auch keine '0' in diese Feld moven kann. Und 2 solcher Felder kann ich zur bemessung einer Zeitspanne auch nicht voneinander abziehen. Es kommt immer die Meldung das Feld sei nicht nummeric (bei *blanks kommt: Feld ist nicht char).

    Bei der Datenart T ist genau das gleiche.

    [Dieser Beitrag wurde von Steven am 02. Dezember 2002 editiert.]

  2. #2
    Registriert seit
    Jan 2001
    Beiträge
    340

    Post

    Zitat:

    ... Datenart Z, ... Kann mir jemand sagen welches Format dieses Feld dann hat (nummeric, char, ...)?
    [/quote]

    weder noch, sondern Z = Timestamp ( Zeitmarke )

    Zitat:

    Ich habe nämlich das Problem das ich kein *blanks und auch keine '0' in diese Feld moven kann.
    [/quote]

    das sind auch keine gültigen Zeitmarken

    Zitat:

    Und 2 solcher Felder kann ich zur bemessung einer Zeitspanne auch nicht voneinander abziehen.
    [/quote]

    wenn du jetzt verraten würdest, was du machst (RPG, COBOL, SQL ... ?????)

    Zitat:

    Bei der Datenart T ist genau das gleiche.
    [/quote]

    das ist T = Time ( Zeit )

    für diese Datentypen gibt es Operatoren, aber dazu müsstest du verraten, was du ... na ja, siehe oben

    Gruß
    Rolf

  3. #3
    Registriert seit
    Aug 2001
    Beiträge
    2.928

    Post

    Hallo Steven,

    eine Zeitmarke sieht wie folgt aus:
    'YYYY-MM-DD-HH.MM.SS.MSMSMS' Länge= 26 MSMSMS= Micro-Sekunden

    Untergrenze: '0001-01-01-00.00.00.000000'
    Obergrenze: '9999-12-31-24.00.00.000000'

    Initialisierung einer Zeitmarke:
    C Eval ZeitMarke = *LoVal
    C Clear ZeitMarke

    Diese Anzeige ist jedoch nur die Aufbereitung eines fortlaufenden numerischen Wertes, mit dem gerechnet werden kann.

    Ähnliches kannst Du auch in EXCEL ausprobieren. Definiere ein Datum und ändere anschliessend das Format in Standard.

    Zur Berechnung einer Zeit-Differenz kannst Du die Zeitmarken nicht einfach durch Minus oder SUB voneinander abziehen, sondern Du musst den Opcode SUBDUR oder die Built-In-Function %DIFF verwenden.
    Bei beiden Varianten kannst Du angeben, in welcher Zeitart (z.B. Tag/Stunde) die Differenz ausgegeben werden soll.

    Beispiel für die Differenz in Tagen:
    C ZeitM1 subdur ZeitM2 Diff:*D
    C eval Diff = %Diff(ZeitM1: ZeitM2: *D)

    Weitere Informationen findest Du in der RPGIV-Referenz.

    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

  4. #4
    Registriert seit
    Sep 2002
    Beiträge
    61

    Post

    Danke für die Antworten. Das funktioniert jetzt.

    Kann mir noch jemand sagen wie ich die Zeit in Hundertstel ausrechne *h funktioniert nicht.

    @ Rolf: Ich programmiere mit RPG/LE

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.695

    Post

    Im Befehl SUBDUR bzw. %DIFF gibt es mehrere Differenztypen (aufgelistet im RPG/LE-Handbuch). Hundertstel gibt es zwar nicht, aber die Differenz kann in Micro-Sekunden mit *MS berechnet werden. Dabei ist allerdings das Zielfeld groß genug zu definieren (z.B. 30,0) da die Differenz sehr groß werden kann. Passt das Ergebnis nicht, wird ein Überlauf als Fehler gemeldet.

    Ist das Zielfeld wiederun eine Zeitmarke, wird das Ergebnis in Tagen/Stunden/Minuten/Sekunden/Microsekunden ausgegeben.
    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
    Jan 2001
    Beiträge
    340

    Post

    Beispiel :

    Code:
    d t1              s               z   inz(z'2002-12-02-01.01.01.000100')
    d t2              s               z   inz(z'2002-12-02-01.01.01.000010')
    d t3              s             20p 6
    
    c/Exec SQl
    c+   set :t3 = :t1 - :t2
    c/End-exec
    
    c                   eval      *inLr = *on
    c                   return
    Ergebnis :

    T3 = 00000000000000.000090

    Aus dem Handbuch:

    Zitat:

    Timestamp duration

    A timestamp duration represents a number of years,
    months, days, hours, minutes, seconds, and
    microseconds, expressed as a DECIMAL(20,6)
    number. To be properly interpreted, the number
    must have the format yyyymmddhhmmsszzzzzz,
    where yyyy, mm, dd, hh, mm, ss, and zzzzzz
    represent, respectively, the number of years,
    months, days, hours, minutes, seconds, and
    microseconds. The result of subtracting one
    timestamp value from another is a timestamp
    duration.
    [/quote]

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.695

    Post

    Nun, das mit der SQL-Anweisaung entspricht genau der SUBDUR-Anweisung in der eine Zeitmarke als Zielfeld angegeben ist !

    Das Problem hierbei ist aber, dass ich für die genaue Anzahl (z.B. Minuten) das Zielfeld unterdefinieren muss um die einzelnen Stellen (Jahre/Tage/Stunden...) der Differenz auszumultiplizieren.
    Das 20p6-Feld muss ich dann noch in eine Struktur expandieren um überhaupt an die Einzelwerte zu kommen.

    Ist das Zielfeld aber bereits ein numerisches Feld, erledigt das RPG automatisch für mich:

    d T1 Z
    d T2 Z
    d Dauer 30p 0

    T1 SUBDUR T2:*M Dauer
    oder
    eval Dauer = %Diff(T1:T2:*MINUTE)

    Ich bekomme dann die genaue Anzahl Minuten der Zeitdifferenz und nicht die Anzahl Jahre/Tage/Stunden/...
    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

  8. #8
    Registriert seit
    Dec 2000
    Beiträge
    79

    Post

    mit SQL müsste das Statement wie folgt aussehen, dann liefert es auch die Minuten:

    SET :T3 = TIMESTAMPDIFF(4,cast((:T2-:T1) as CHAR(22)))

Similar Threads

  1. Datenart in LF ändern
    By Mr.iSeries in forum IBM i Hauptforum
    Antworten: 7
    Letzter Beitrag: 25-01-07, 08:46
  2. CHGCMDDFT mit mehreren Werten
    By GSM in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 28-10-05, 18:52
  3. Datenart "L"
    By denni in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 05-01-04, 12:27

Berechtigungen

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