date hinzufügen, ohne einen Monat zu überschreiten

Ich hoffe, dass mir jemand dabei helfen könnte.

Ich möchte einen Monat zu einem databasedatum hinzufügen, aber ich möchte verhindern, dass an diesen Tagen am Ende zwei überspringende Monate erscheinen.

Zum Beispiel könnte ich haben:

31. Januar 2009

Und ich möchte bekommen

28. Februar 2009

und nicht

2. März 2009

Nächstes date wäre

28. März 2009

28. Juni 2009

etc.

Gibt es eine function, die diese Art von Operation bereits in Oracle ausführt?

BEARBEITEN

Yeap. Ich möchte jeden Monat alle datasätze mit einem Status zum nächsten kopieren (damit der Benutzer nicht jeden Monat weitere 2.000 Zeilen eingeben muss)

Ich kann alle datasätze abrufen und das date manuell aktualisieren (naja, imperativ), aber ich würde lieber die SQL machen lassen.

Etwas wie:

insert into the_table select f1,f2,f3, f_date + 30 /* sort of ... :S */ from the_Table where date > ? 

Aber das Problem kommt mit dem letzten Tag.

Irgendeine Idee, bevor ich so etwas programmieren muss?

 for each record in createObject( record ) object.date + date blabala if( date > 29 and if februrary and the moon and the stars etc etc 9 end update.... et 

EDIT: 2

Hinzufügen von Monaten hat den Trick gemacht.

jetzt habe ich nur das:

 insert into my_table select f1, add_months( f2, 1 ) from my_table where status = etc etc 

Danke für die Hilfe.

Solutions Collecting From Web of "date hinzufügen, ohne einen Monat zu überschreiten"

Oracle hat eine integrierte function ADD_MONTHS , die genau das tut:

 SQL> select add_months(date '2008-01-31',1) from dual; ADD_MONTHS( ----------- 29-FEB-2008 SQL> select add_months(date '2008-02-29',1) from dual; ADD_MONTHS( ----------- 31-MAR-2008 

Ich habe gerade getan: Wählen Sie add_months (TO_DATE ('30 -DEC-08 '), 2) von Dual

und bekam 28-FEB-2009

Keine Notwendigkeit, LAST_DAY zu verwenden. Wenn Sie diese Route genommen haben, könnten Sie eine function erstellen, die: 1. ein date verwendet 2. den Tag auf den ersten des Monats ändert. 3. Fügen Sie einen Monat hinzu. 4. Ändert den Tag auf LAST_DAY für diesen Monat.

Ich denke, du wirst es selbst schreiben müssen. Mein Rat ist, zuerst den "letzten Tag des Monats" mit dieser Methode zu bewerten:

  • Einen Monat hinzufügen (nicht 30 Tage, einen Monat!)
  • Finde den ersten Tag des Monats (sollte einfach sein)
  • einen Tag subtrahieren

Dann vergleiche es mit deinem "plus x Tage" -Wert und wähle den niedrigsten (Ich habe die Logik hinter dem Sprung vom 31. Januar bis zum 28. Februar verstanden, aber ich verstehe es nicht für den Sprung vom 28. Februar bis zum 28. Januar -Beschädigen)

Es klingt, als ob Sie den aktuellen Monat plus eins möchten (mit entsprechendem Rollover im Dezember)

und das Minimum des letzten Tages dieses Monats und des aktuellen Tages.