MONTHS_BETWEEN
MONTHS_BETWEEN
MONTHS_BETWEEN 함수는 두 DATE 또는 TIMESTAMP 값 사이의 개월 수를 반환해요.
출처: MONTHS_BETWEEN
본문
MONTHS_BETWEEN 함수는 두 DATE 또는 TIMESTAMP 값 사이의 개월 수를 반환해요.
예를 들어, MONTHS_BETWEEN('2020-02-01'::DATE, '2020-01-01'::DATE)는 1.0을 반환해요.
함께 보기: DATEDIFF
구문 (Syntax)
MONTHS_BETWEEN( <date_expr1> , <date_expr2> )
인자 (Arguments)
- date_expr1 — 뺄셈의 기준이 되는 날짜예요 (subtract from).
- date_expr2 — 뺄 날짜예요 (subtract).
반환 (Returns)
두 날짜 사이의 개월 수를 나타내는 FLOAT를 반환해요.
숫자는 다음과 같이 계산돼요:
FLOAT의 정수 부분은 입력 값의 연(year)과 월(month) 부분을 사용해 계산돼요.- 대부분의 경우 소수 부분은 입력 값의 일(day)과 시각(time) 부분을 사용해 계산돼요. (달의 분수를 계산할 때 함수는 각 달을 31일로 간주해요.) 그러나 두 가지 예외가 있어요: 월의 일(day)이 같으면(예: 2월 28일과 3월 28일) 입력 값 중 하나 또는 둘 모두가 타임스탬프이고 시각이 달라도 소수 부분은 0이에요. 월의 일이 둘 다 그 달의 마지막 날이면(예: 2월 28일과 3월 31일) 월의 일이 같지 않아도 소수 부분은 0이에요. 예를 들어 함수는 다음 각 날짜/타임스탬프 쌍을 정확히 1.0개월 차이로 간주해요: 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(각 달의 마지막 날).
사용 메모 (Usage notes)
- 날짜(또는 타임스탬프) d1이 d2보다 더 이른 시점을 나타내면
MONTHS_BETWEEN(d1, d2)는 음수 값을 반환하고, 그렇지 않으면 양수 값을 반환해요. 더 일반적으로, 입력을 바꾸면 부호가 역전돼요:MONTHS_BETWEEN(d1, d2) = -MONTHS_BETWEEN(d2, d1). - 한 입력 매개변수에
DATE값을, 다른 매개변수에TIMESTAMP를 사용할 수 있어요. - 하나 이상의
TIMESTAMP값을 사용하지만 시간대(하루 중 시각)에 따른 분수 차이를 원하지 않으면TIMESTAMP표현식을DATE로 캐스트해요. - 정수 값만 원하면 값을 절삭(truncate), 반올림(round) 또는 캐스트할 수 있어요. 예를 들어:
SELECT ROUND(MONTHS_BETWEEN('2019-03-31 12:00:00'::TIMESTAMP, '2019-02-28 00:00:00'::TIMESTAMP)) AS MonthsBetween1; +----------------+ | MONTHSBETWEEN1 | |----------------| | 1 | +----------------+ - 입력 중 하나라도
NULL이면 결과는NULL이에요.
예제 (Examples)
이 예제는 정수 개월의 차이를 보여줘요. 첫 번째 날짜 쌍은 월의 일(day)이 같아요(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 |
+----------------+----------------+----------------+
함수가 월의 일(day)이 같을 때(예: 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 |
+----------------+----------------+
더 알아보기 (Learn more)
- DATEDIFF
- 날짜 및 시간 함수 (Date & time functions)