Anmelden

View Full Version : SUBDUR oder auch %DIFF



Peet
22-01-08, 18:15
Hallo zusammen,

ich errechne die Differenz zweier Datumsfelder in Monaten:

datum1 subdur datum2 monate:M
oder auch
eval monate = %diff(datum1:datum2:*M)

Beispiel
datum1 = 31.03.2008
datum2 = 01.01.2008

Jetzt ergibts das doch tatsächlich 2 Monate !?!
Ich hätte jetzt 3 erwartet, der Anwender auch !!!
Mache ich etwas falsch oder sehe ich das nur falsch ?

Natürlich, streng gerechnet sind das keine vollen 3 Monate, liegt es daran ?

Bitte um eure Hilfe !

Danke
peet

Fuerchau
22-01-08, 19:07
Genau!
Immerhin fehlt da ja noch ein Tag und das Ergebnis wird abgeschnitten.

3 - 1 ist ja auch nicht 3 sondern 2.

Du musst halt 1 Tag dazunehmen, wenn du "inclusiv" rechnen willst:

%diff(Datum1 + %days(1) : Datum2 : *M)

B.Hauser
22-01-08, 20:09
Bei der Datums- und Zeitrechnung wird in RPG niemals gerundet, sondern immer abgeschnitten.
Dabei wird nur die Ergebnis-Einheit und die höheren Einheiten berücksichtigt. In Deinem Fall wird also nur das Jahr und der Monat berücksichtigt.

Die Differenz von 2008/03 - 2008/01 beträgt 2

Der folgende Absatz stammt aus der RPG Reference (Built-in-Functionn %DIFF)


The difference is calculated by subtracting the second operand from the first.
The result is rounded down, with any remainder discarded. For example, 61 minutes is equal to 1 hour, and 59 minutes is equal to 0 hours.

Birgitta

Robi
16-09-24, 14:58
Uralt, ich weis ...

Trotzdem... heute im Debug ...

eval wert = %diff(%date():mo1:*M)
mit MO1 = 2023-11-30 (Typ D)

Ergebnis 9!
Also %diff(2024-09-16:2023-11-30) in Monaten = 9?

Warum nicht 10

Das krieg ich nicht auf die Reihe
Danke

Fuerchau
16-09-24, 15:43
Die Rechnung, ist irgendwo beschrieben, macht (days(date1) - days(date2)) / 30.
Rechne einfach in Excel nach:
16.09.24 - 30.11.23 = 291 Tage, / 30 = 9,7 Monate, abgeschnitten = 9
Da ja nicht gerundet wird.....

Sämtliche Differenz-Routinen mit Datum nehmen leider 30 Tage je Monat und 365 Tage je Jahr.
In SQL hast du ähnliche funktionen, alledings mit Floor(...) wird immer aufgerundet, bzw. bei negativen Werten abgerundet.