excel에서 두 날짜 간의 연도가 차지하는 비율을 계산하는 함수는 YEARFRAC()이다.

그런데, 이 함수가 정확히 어떻게 동작하는지를 찾아보니 제대로 설명된 곳이 별로 없다.


YEARFRAC(<start_date>, <end_date>, <basis>)


앞의 두 인자는 날짜이고, 세번째 인자인 basis는 계산 유형을 지정하는 것이다.

basis에는 0~4가 지정될 수 있고, 생략시는 0.


그런데, 0일 때의 동작방식이 뭔가 모호하다.

한 달을 30일로 가정하고 계산한다는데, 보통 아래와 같은 식으로 표현한다.


yearfrac \= \frac{360 \times(Y_2-Y_1)+30 \times (M_2-M_1)+(D_2-D_1)}{360}


즉, 1년을 360일, 한 달을 30일로 가정하고 계산하는 것이다.


그런데… 실제로 해보면 다른 결과가 나올 때가 있다.



대부분의 경우에는 첫번째와 같이 똑같은 결과가 나오지만, 가끔씩 두번째와 같이 차이가 발생한다.


좀 더 뒤져보니 정확한 동작 메커니즘이 설명되어있는 문서를 찾을 수 있었다: YEARFRAC Incompatibilities between Excel 2007…[각주:1]


  • Basis 0 or omitted: 30/360. Truncates date values and swaps them if date1 is after date2. If the dates are equal, the difference of days is 0. Assumes that each month has 30 days and the total number of days in the year is 360 by making the following adjustments:
    • If both day-of-months are 31, they are changed to 30
    • Otherwise, if date1’s day-of-month is 31, it is changed to 30
    • Otherwise, if date1’s day-of-month is 30 and date2’s day-of-month is 31, date2’s day-of-month is changed to 30 (note that date2’s day-of-month will stay 31 if date1’s day < 30)
    • Otherwise, if both dates are the last day of February in their respective years, both day-of-month is changed to 30
    • Otherwise, if date1 is the last day of February, its day-of-month is changed to 30


요약하자면, 두 날짜가 월말일 때는 30일로 적절히 정리한 뒤 계산한다는 뜻이다.

이런 과정을 거치고 나면 두 값이 완벽하게 동일한 것을 확인할 수 있다.



  1. 이 문서의 주 내용은 excel과 OOXML 간에 yearfrac()의 계산방법이 차이가 있어 위험성이 크다는 내용임 [본문으로]
신고

+ Recent posts