PDA

View Full Version : Datenart von Zeitfeld



Steven
02-12-02, 10:12
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.]

rmittag
02-12-02, 11:04
<BLOCKQUOTE><font size="1" face="Verdana, Arial">Zitat:</font><HR>
... Datenart Z, ... Kann mir jemand sagen welches Format dieses Feld dann hat (nummeric, char, ...)?
[/quote]

weder noch, sondern Z = Timestamp ( Zeitmarke )

<BLOCKQUOTE><font size="1" face="Verdana, Arial">Zitat:</font><HR>
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

<BLOCKQUOTE><font size="1" face="Verdana, Arial">Zitat:</font><HR>
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 ... ?????)

<BLOCKQUOTE><font size="1" face="Verdana, Arial">Zitat:</font><HR>
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

B.Hauser
02-12-02, 11:50
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

Steven
03-12-02, 08:40
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

Fuerchau
03-12-02, 09:38
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.

rmittag
03-12-02, 09:49
Beispiel :



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:

<BLOCKQUOTE><font size="1" face="Verdana, Arial">Zitat:</font><HR>
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]

Fuerchau
04-12-02, 09:44
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/...

horschma
04-12-02, 13:28
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)))