- 카테고리:
MONTHS_BETWEEN¶
두 DATE 또는 TIMESTAMP 값 사이의 개월 수를 반환합니다.
예를 들어, MONTHS_BETWEEN('2020-02-01'::DATE, '2020-01-01'::DATE)
는 1.0을 반환합니다.
- 참고 항목:
구문¶
MONTHS_BETWEEN( <date_expr1> , <date_expr2> )
인자¶
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 | +----------------+
입력이 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 | +----------------+----------------+
다음 예는 소수 월의 차이를 보여줍니다.
첫 번째 열의 경우, 함수에 두 날짜가 전달됩니다.
두 번째 열의 경우, 첫 번째 열에 사용된 것과 동일한 두 날짜를 나타내지만 시간은 다른 두 개의 타임스탬프가 함수에 전달됩니다. 두 번째 열의 차이는 시간의 차이로 인해 첫 번째 열보다 큽니다.
세 번째 열의 경우, 해당 월의 같은 날을 나타내는 두 개의 타임스탬프가 함수에 전달됩니다. 이로 인해 함수는 타임스탬프 간의 시간 차이를 무시하므로 소수 부분은 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 | +----------------+----------------+----------------+
월의 날이 같은 경우(예: 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 | +----------------+----------------+----------------+
이 예는 매개 변수의 순서를 반대로 하면 결과의 부호가 반대로 됨을 보여줍니다.
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 | +----------------+----------------+