Kategorien:

Datums- und Uhrzeitfunktionen

MONTHS_BETWEEN

Gibt die Anzahl der Monate zwischen zwei DATE- oder TIMESTAMP-Werten zurück.

Zum Beispiel gibt MONTHS_BETWEEN('2020-02-01'::DATE, '2020-01-01'::DATE) den Wert 1,0 zurück.

Siehe auch:

DATEDIFF

Syntax

MONTHS_BETWEEN( <date_expr1> , <date_expr2> )

Argumente

Datumsausdruck1

Das Datum, von dem subtrahiert werden soll.

Datumsausdruck2

Das zu subtrahierende Datum.

Rückgabewerte

Ein FLOAT-Wert steht für die Anzahl der Monate zwischen den beiden Daten.

Die Anzahl wird wie unten beschrieben berechnet:

  • Der ganzzahlige Anteil des FLOAT-Wertes wird unter Verwendung der Jahres- und des Monatswerts der Eingabedaten berechnet.

  • In den meisten Situationen wird der Bruchteil unter Verwendung der Tages- und Uhrzeitwerte der Eingabedaten berechnet. (Bei der Berechnung des Bruchteils eines Monats berücksichtigt die Funktion, dass jeder Monat 31 Tage lang ist.)

    Es gibt jedoch zwei Ausnahmen:

    • Wenn die Tage des Monats gleich sind (z. B. 28. Februar und 28. März), ist der Bruchteil null, auch dann, wenn einer oder beide Eingabewerte Zeitstempel sind und sich die Zeitwerte unterscheiden.

    • Wenn die Tage des Monats gleichzeitig die letzten Tage des Monats sind (z. B. 28. Februar und 31. März), ist der Bruchteil null, auch wenn die Tage des Monats nicht gleich sind.

    Beispielsweise betrachtet die Funktion jedes der folgenden Datums-/Zeitstempelpaare so, als ob es genau 1,0 Monate auseinander liegt:

    Datum/Zeitstempel 1

    Datum/Zeitstempel 2

    Anmerkungen

    2019-03-01 02:00:00

    2019-02-01 13:00:00

    Derselbe Tag eines jeden Monats.

    2019-03-28

    2019-02-28

    Derselbe Tag eines jeden Monats.

    2019-03-31

    2019-02-28

    Der letzte Tag eines jeden Monats.

    2019-03-31 01:00:00

    2019-02-28 13:00:00

    Der letzte Tag eines jeden Monats.

Nutzungshinweise

  • Wenn das Datum (oder der Zeitstempel) d1 einen früheren Zeitpunkt als d2 darstellt, gibt MONTHS_BETWEEN(d1, d2) einen negativen Wert zurück, andernfalls einen positiven Wert. Allgemeiner ausgedrückt wird durch Vertauschen der Eingänge das Vorzeichen umgekehrt: MONTHS_BETWEEN(d1, d2) = -MONTHS_BETWEEN(d2, d1).

  • Sie können einen DATE-Wert für den einen Eingabeparameter und einen TIMESTAMP-Wert für den anderen verwenden.

  • Wenn Sie einen oder mehrere TIMESTAMP-Werte verwenden, aber keine tageszeitabhängigen Bruchteilunterschiede wünschen, wandeln Sie Ihre TIMESTAMP-Ausdrücke in DATE-Ausdrücke um.

  • Wenn Sie nur ganzzahlige Werte wünschen, können Sie den Wert abschneiden, runden oder umwandeln. Beispiel:

    SELECT
        ROUND(MONTHS_BETWEEN('2019-03-31 12:00:00'::TIMESTAMP,
                             '2019-02-28 00:00:00'::TIMESTAMP)) AS MonthsBetween1;
    +----------------+
    | MONTHSBETWEEN1 |
    |----------------|
    |              1 |
    +----------------+
    
  • Wenn eine Eingabe NULL ist, ist das Ergebnis NULL.

Beispiele

Dieses Beispiel zeigt die Unterschiede von ganzzahligen Monatswerten. Das erste Datumspaar hat den gleichen Tag des Monats (den 15.). Das zweite Datumspaar sind die beiden letzten Tage des jeweiligen Monats (28. Februar und 31. März).

SELECT
    MONTHS_BETWEEN('2019-03-15'::DATE,
                   '2019-02-15'::DATE) AS MonthsBetween1,
    MONTHS_BETWEEN('2019-03-31'::DATE,
                   '2019-02-28'::DATE) AS MonthsBetween2;
+----------------+----------------+
| MONTHSBETWEEN1 | MONTHSBETWEEN2 |
|----------------+----------------|
|       1.000000 |       1.000000 |
+----------------+----------------+

Das nächste Beispiel zeigt Unterschiede in Monaten mit Bruchteilen.

  • Für die erste Spalte werden der Funktion zwei Datumswerte übergeben.

  • Für die zweite Spalte werden der Funktion zwei Zeitstempelwerte übergeben, die die gleichen beiden Datumsangaben wie für die erste Spalte darstellen, jedoch mit unterschiedlichen Uhrzeiten. Die Differenz in der zweiten Spalte ist aufgrund der Zeitunterschiede größer als in der ersten Spalte.

  • Für die dritte Spalte werden der Funktion zwei Zeitstempel übergeben, die für den gleichen Tag des jeweiligen Monats stehen. Dies führt dazu, dass die Funktion Zeitunterschiede zwischen den Zeitstempeln ignoriert, sodass der Bruchteil 0 ist.

SELECT
    MONTHS_BETWEEN('2019-03-01'::DATE,
                   '2019-02-15'::DATE) AS MonthsBetween1,
    MONTHS_BETWEEN('2019-03-01 02:00:00'::TIMESTAMP,
                   '2019-02-15 01:00:00'::TIMESTAMP) AS MonthsBetween2,
    MONTHS_BETWEEN('2019-02-15 02:00:00'::TIMESTAMP,
                   '2019-02-15 01:00:00'::TIMESTAMP) AS MonthsBetween3
    ;
+----------------+----------------+----------------+
| MONTHSBETWEEN1 | MONTHSBETWEEN2 | MONTHSBETWEEN3 |
|----------------+----------------+----------------|
|       0.548387 |       0.549731 |       0.000000 |
+----------------+----------------+----------------+

Der Fakt, dass die Funktion eine ganzzahlige Anzahl von Monaten zurückgibt, sowohl, wenn die Tage des Monats gleich sind (z. B. 28. Februar und 28. März), als auch wenn die Tage des Monats der letzte Tag des Monats sind (z. B. 28. Februar und 31. März) kann zu nicht intuitivem Verhalten führen. Insbesondere führt die Erhöhung des ersten Datums im Paar nicht immer zu einer Erhöhung des Ausgabewerts. Wenn in diesem Beispiel das erste Datum von 28. März auf 30. März und dann auf 31. März erhöht wird, erhöht sich die Differenz von 1,0 auf eine größeren Wert und verringert sich dann wieder auf 1,0.

  • Für die erste Spalte stellen die Eingabedaten denselben Tag von verschiedenen Monaten dar, sodass die Funktion für den Bruchteil des Ergebnisses 0 zurückgibt.

  • Für die zweite Spalte stellen die Eingabedaten verschiedene Tage von verschiedenen Monaten dar (wobei es sich bei beiden Tagen nicht um den letzten Tag des Monats handelt), sodass die Funktion den Bruchteil des Ergebnisses berechnet.

  • Für die dritte Spalte stellen die Eingabedaten die jeweils letzten Tage von zwei verschiedenen Monaten dar, sodass die Funktion wiederum 0 für den Bruchteil des Ergebnisses zurückgibt.

SELECT
    MONTHS_BETWEEN('2019-03-28'::DATE,
                   '2019-02-28'::DATE) AS MonthsBetween1,
    MONTHS_BETWEEN('2019-03-30'::DATE,
                   '2019-02-28'::DATE) AS MonthsBetween2,
    MONTHS_BETWEEN('2019-03-31'::DATE,
                   '2019-02-28'::DATE) AS MonthsBetween3
    ;
+----------------+----------------+----------------+
| MONTHSBETWEEN1 | MONTHSBETWEEN2 | MONTHSBETWEEN3 |
|----------------+----------------+----------------|
|       1.000000 |       1.064516 |       1.000000 |
+----------------+----------------+----------------+

Das folgende Beispiel zeigt, dass die Umkehrung der Reihenfolge der Parameter das Vorzeichen des Ergebnisses umkehrt:

SELECT
    MONTHS_BETWEEN('2019-03-01'::DATE,
                   '2019-02-01'::DATE) AS MonthsBetween1,
    MONTHS_BETWEEN('2019-02-01'::DATE,
                   '2019-03-01'::DATE) AS MonthsBetween2
    ;
+----------------+----------------+
| MONTHSBETWEEN1 | MONTHSBETWEEN2 |
|----------------+----------------|
|       1.000000 |      -1.000000 |
+----------------+----------------+