카테고리:

날짜 및 시간 함수

MONTHS_BETWEEN

두 DATE 또는 TIMESTAMP 값 사이의 개월 수를 반환합니다.

예를 들어, MONTHS_BETWEEN('2020-02-01'::DATE, '2020-01-01'::DATE) 는 1.0을 반환합니다.

참고 항목:

DATEDIFF

구문

MONTHS_BETWEEN( <date_expr1> , <date_expr2> )
Copy

인자

date_expr1

뺄 출처 날짜입니다.

date_expr2

뺄 날짜입니다.

반환

FLOAT는 두 날짜 사이의 개월 수를 나타냅니다.

숫자는 다음과 같이 계산됩니다.

  • FLOAT의 정수 부분은 입력 값의 연도 및 월 부분을 사용하여 계산됩니다.

  • 대부분의 경우, 소수 부분은 입력 값의 날짜 및 시간 부분을 사용하여 계산됩니다. (월의 일부를 계산할 때 함수는 각 월을 31일로 간주합니다.)

    그러나 다음과 같이 두 가지 예외가 있습니다.

    • 날짜가 같은 경우(예: 2월 28일과 3월 28일), 소수 부분은 0입니다. 입력 값 중 하나 또는 둘 모두가 타임스탬프이고 그 시간이 다르더라도 마찬가지입니다.

    • 해당 월의 날짜가 모두 해당 월의 마지막 날인 경우(예: 2월 28일 및 3월 31일), 소수 부분은 0입니다. 해당 일자가 동일하지 않더라도 마찬가지입니다.

    예를 들어, 함수는 다음 날짜/타임스탬프 쌍 각각을 정확히 1.0개월 간격으로 간주합니다.

    날짜/타임스탬프 1

    날짜/타임스탬프 2

    참고

    2019-03-01 02:00:00

    2019-02-01 13:00:00

    각 월의 같은 날입니다.

    2019-03-28

    2019-02-28

    각 월의 같은 날입니다.

    2019-03-31

    2019-02-28

    각 월의 마지막 날입니다.

    2019-03-31 01:00:00

    2019-02-28 13:00:00

    각 월의 마지막 날입니다.

사용법 노트

  • 날짜(또는 타임스탬프) d1이 d2보다 이전 시점을 나타내는 경우, MONTHS_BETWEEN(d1, d2) 는 음수 값을 반환하며, 그렇지 않은 경우 양수 값을 반환합니다. 더 일반적으로는, 입력을 바꾸면 다음과 같이 부호가 바뀝니다. MONTHS_BETWEEN(d1, d2) = -MONTHS_BETWEEN(d2, d1).

  • 한 입력 매개 변수에는 DATE 값을 사용하고, 다른 매개 변수에는 TIMESTAMP를 사용할 수 있습니다.

  • 하나 이상의 TIMESTAMP 값을 사용하지만, 하루 중 시간에 따른 소수 차이를 원하지 않는 경우, TIMESTAMP 식을 DATE로 캐스팅하십시오.

  • 정수 값만 원하는 경우, 값을 자르거나 반올림하거나 캐스팅할 수 있습니다. 예:

    SELECT
        ROUND(MONTHS_BETWEEN('2019-03-31 12:00:00'::TIMESTAMP,
                             '2019-02-28 00:00:00'::TIMESTAMP)) AS MonthsBetween1;
    +----------------+
    | MONTHSBETWEEN1 |
    |----------------|
    |              1 |
    +----------------+
    
    Copy
  • 입력이 NULL인 경우, 결과는 NULL입니다.

이 예는 전체 월의 차이를 보여줍니다. 첫 번째 날짜 쌍은 해당 월의 같은 날(15일)을 갖습니다. 두 번째 날짜 쌍은 해당 월의 마지막 날입니다(2월 28일 및 3월 31일).

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 |
+----------------+----------------+
Copy

다음 예는 소수 월의 차이를 보여줍니다.

  • 첫 번째 열의 경우, 함수에 두 날짜가 전달됩니다.

  • 두 번째 열의 경우, 첫 번째 열에 사용된 것과 동일한 두 날짜를 나타내지만 시간은 다른 두 개의 타임스탬프가 함수에 전달됩니다. 두 번째 열의 차이는 시간의 차이로 인해 첫 번째 열보다 큽니다.

  • 세 번째 열의 경우, 해당 월의 같은 날을 나타내는 두 개의 타임스탬프가 함수에 전달됩니다. 이로 인해 함수는 타임스탬프 간의 시간 차이를 무시하므로 소수 부분은 0입니다.

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 |
+----------------+----------------+----------------+
Copy

월의 날이 같은 경우(예: 2월 28일 및 3월 28일)와 월의 날이 마지막 날인 경우(예: 2월 28일 및 3월 31일) 모두 함수가 월의 정수를 반환한다는 사실은 비직관적인 동작으로 이어질 수 있습니다. 이러한 비직관적인 동작으로는 특히, 쌍의 첫 번째 날짜를 늘린다고 해서 출력 값이 항상 늘어나는 것은 아니라는 점이 있습니다. 이 예에서 첫 번째 날짜가 3월 28일에서 3월 30일로 증가한 다음, 3월 31일로 증가함에 따라 차이는 1.0에서 더 큰 숫자로 증가한 다음, 다시 1.0으로 감소합니다.

  • 첫 번째 열의 경우, 입력 날짜는 서로 다른 월의 같은 날을 나타내므로 함수는 결과의 소수 부분에 대해 0 을 반환합니다.

  • 두 번째 열의 경우, 입력 날짜는 서로 다른 월의 서로 다른 날짜를 나타내므로(둘 다 월의 마지막 날이 아님) 이 함수는 결과의 소수 부분을 계산합니다.

  • 세 번째 열의 경우, 입력 날짜는 서로 다른 두 월의 마지막 날을 나타내므로 함수는 결과의 소수 부분에 대해 다시 0 을 반환합니다.

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 |
+----------------+----------------+----------------+
Copy

이 예는 매개 변수의 순서를 반대로 하면 결과의 부호가 반대로 됨을 보여줍니다.

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 |
+----------------+----------------+
Copy