PDA

View Full Version : Datumsberechnungen: Monate addieren/subtrahieren



Seiten : [1] 2

Tiki777
01-07-15, 13:04
Hallo Zusammen,

ich habe eine Frage an die Spezialisten der Datumsberechnungen:

Ich möchte ab einem eingegebenen Datum monatliche Sätze erstellen, d.h. ab 01.08.2015 jeden Monat bis vorgeg. Ende: 01.09.2015, 01.10.2015 etc.
Ich rechne den nächsten Monat mit: EVAL $DATD01 += %MONTHS(1)

Wie löse ich das elegant, wenn ich den 30. oder 31. eingebe? 31.1. + 1 Monat gibt 28 (oder 29.)2., die nächste Addition bringt mir den 28.3.

Ich kann natürlich schon die althergebrachten Prüfungen einbauen, damit es funkt., aber nachdem die Addition mit Monaten so schön ist und auch die Gültigkeitsprüfung auf das Monatsende quasi beinhaltet, frage ich mich, ob es etwas besseres geben könnte?

Vielen Dank!

Robi
01-07-15, 13:22
Moin,
bleib doch bei deiner Basis und erhöhe die Anzahl Monate die du drauf rechnest.

RestProblem: Start = 28.2. da mußt du die Basis selber verändern


Robi

BenderD
01-07-15, 13:39
nextUltimo = ((ultimo + %days(1))
+ %months(1)) - %days(1);

Robi
01-07-15, 13:47
@DB
ja! das ist besser!

BenderD
01-07-15, 13:59
... wenn der Ultimo schon Schlunz war, geht auch:
ultimo = anyDate + %months(1);
ultimo = ultimo - %days(%subdt(ultimo : *DAYS));

das liefert den Ultimo zu einem beliebigen Datum.

D*B

Tiki777
01-07-15, 14:42
Danke für die schnellen Antworten.

D*B, das funktioniert super beim 31., da ich dann ja immer den Ultiomo möchte.
Wenn ich aber den 30. habe und eben immer den 30. möchte, funktioniert es schon nicht mehr.

Robi
01-07-15, 14:47
Stimmt.
Aber woher sollen wir wissen was du willst?

dann musst du doch meine Methode nehmen.
Robi

BenderD
01-07-15, 14:50
... im Februar gibt es keinen 30. zu möchten, ansonsten kann ich natürlich auch auf den 1. eines Monats 29 Tage drauf addieren - lass doch mal Deine Phantasie spielen gehen...

D*B

B.Hauser
01-07-15, 14:54
Dann verwende doch die SQL-Funktion ADD_MONTHS(Datum, AnzMonate).
Wenn das Ausgangsdatum ein Monatsende ist, wird das Zieldatum auch ein Monatsende sein, unabhängig ob das Monatsende des Ausgangsdatum der 28, 29, 30 oder 31 ist.
Ist das Ausgangsdatum kein Monatsende, so wird die Anzahl der Monate addiert. Existiert das rechnerische Zieldatum nicht, z.B. auf den 31.01 wird ein Monat addiert, so wird das Monatsende im Ziel-Monat verwendet.


Exec SQL Set :NewDate = Add_Months(:StartDate, 3);

Um sicherzustellen, dass das Ausgangsdatum immer ein Monatsende ist, kann man zusätzlich noch die Funktion LAST_DAY verwenden


Exec SQL Set :NewDate = Add_Months(Last_Day(:StartDate), 3);

Birgitta

Tiki777
01-07-15, 14:55
Nett, vielen Dank euch beiden.