Sehen Sie sich die Ergebnisse der folgenden Abfragen an:
%Vor%Wie kann ich "30-MAR-11" erhalten, wenn ich 4 Monate zu einem bestimmten Datum hinzufüge?
Bitte helfen Sie.
Hier gibt es eine weitere Frage zu Oracle und Java
Es besagt, dass
Aus der Oracle-Referenz auf add_months Ссылка
Wenn das Datum der letzte Tag des Monats ist oder der resultierende Monat weniger Tage als die Tageskomponente des Datums hat, ist das Ergebnis der letzte Tag des resultierenden Monats. Andernfalls hat das Ergebnis die gleiche Tageskomponente wie das Datum.
Ich denke, Sie müssen den Tag und den Endtag manuell überprüfen, um das Verhalten der Funktion zu ändern. Oder vielleicht indem Sie Tage statt Monate hinzufügen. (Aber ich fand keine add_day
Funktion in der Referenz)
Als Workaround könnte ich möglicherweise diesen Algorithmus verwenden:
TargetDate1
mit ADD_MONTHS
. Alternativ berechnen Sie das Zieldatum TargetDate2
wie folgt:
1) Wenden Sie ADD_MONTHS
auf den ersten Monat des Quelldatums an
2) addiere die Differenz der Tage zwischen dem Quelldatum und dem Anfang desselben Monats.
Wählen Sie die LEAST
zwischen TargetDate1
und TargetDate2
.
Das Zieldatum wird also am Ende eine andere Tageskomponente enthalten, wenn die Tageskomponente des Quelldatums größer ist als die Anzahl der Tage im Zielmonat. In diesem Fall ist das Zieldatum der letzte Tag des entsprechenden Monats.
Ich bin mir nicht ganz sicher, ob ich Oracle-SQL-Syntax verstehe, aber im Grunde könnte die Implementierung so aussehen:
%Vor%Hier ist eine detaillierte Illustration, wie die Methode funktioniert:
%Vor%Und hier sind einige Beispiele, um verschiedene Fälle zu zeigen:
%Vor%Sie können Intervallarithmetik verwenden, um das gewünschte Ergebnis zu erhalten
%Vor%Beachten Sie jedoch, dass es Probleme mit Intervallarithmetik gibt, wenn Sie mit Tagen arbeiten, die nicht in jedem Monat existieren
%Vor%Die Funktion
add_months
gibt ein Datum plus n Monate zurück.
Da der 30. November das letzte Datum des Monats ist, führt das Hinzufügen von 4 Monaten zu einem Datum, das das Ende von 4 Monaten darstellt. Dies ist das erwartete Verhalten. Wenn die Datumsangaben nicht geändert werden müssen, können Sie den Tag, nachdem das neue Datum zurückgegeben wurde, als Workaround abziehen
%Vor%Dieser Abschnitt in Klammern:
%Vor%gibt Ihnen die Anzahl der Tage zwischen dem Datum der Eingabe und 4 Monaten später. Wenn Sie also diese Anzahl von Tagen zu dem angegebenen Datum hinzufügen, wird das genaue Datum nach 4 Monaten angezeigt.
Hinweis: Ссылка
Abfrageergebnis
STARTDATE 28.2.2014
MONTHS_TO_ADD 1
ORACLES_ADD_MONTH_RESULT 31.03.2014
ADD_DAYS 28
SUBSTRACT_DAYS 31
NET_DAYS_TO_ADJUST -3
MY_ADD_MONTH_RESULT 3/28/2014
MY_ADD_MONTH_FUNCTION_RESULT 3/28/2014
Tags und Links sql oracle date-arithmetic