Количество дней между данными двумя датами, считая фиксированным 30 дней количество дней в месяце. - PullRequest
0 голосов
/ 26 мая 2018

Мне нужно рассчитать разницу между двумя датами с фиксированной логикой 30 дней в месяц.Пример показан ниже
1. Дата начала = 10/4/2018
2. Дата окончания = 28/10 / 2018
3. Ожидаемое количество дней между = 199
(расчет в Excelразница в днях => 28/10/2018 - 4/4/2018 = 201, что не то, что мне нужно) Основа для расчета разницы между двумя датами заключается в том, что количество дней в месяце должно рассматриваться как 30 дней независимо отмесяц.Таким образом, все месяцы между датами начала и окончания с 31 днем ​​должны рассматриваться как 30 дней.Если между ними есть февраль, то его также следует принимать как 30-дневный месяц.

Процедура расчета количества дней между двумя указанными датами:
1. Доля дней в начальном месяце = 30 /4/2018 - 10/4/2018 = 21 день
2. Месяцы с 5 января по 30/9/2018 = 5 месяцев = 5 x 30 = 150 дней
3. Доля дней впоследний месяц = ​​28/10/2018 - 1/10/2018 = 28 дней

Всего дней = 21 + 150 + 28 = 199 дней.

Если A1 - это ячейка даты начала, B1 = ячейка даты окончания, пожалуйста, предложите, как это сделать в Excel.Заранее благодарны за Вашу помощь.

Ответы [ 3 ]

0 голосов
/ 26 мая 2018

Я разбил формулу на три компонента, как в вашем примере: screen shot

Формулы в D2: G2:

D2: =IF(AND(YEAR(A2)=YEAR(B2),MONTH(A2)=MONTH(B2)),MIN(DATE(YEAR(A2),MONTH(A2),30),B2),DATE(YEAR(A2),MONTH(A2),30))-MIN(DATE(YEAR(A2),MONTH(A2),30),A2)+1
E2: =MAX(((YEAR(B2)-YEAR(A2))*12+MONTH(B2)-MONTH(A2)-1)*30,0)
F2: =MIN(IF(AND(YEAR(B2)=YEAR(A2),MONTH(B2)=MONTH(A2)),0,B2-DATE(YEAR(B2),MONTH(B2),1)+1),30)
G2: =SUM(D2:F2)

или все в одном:

=IF(AND(YEAR(A2)=YEAR(B2),MONTH(A2)=MONTH(B2)),MIN(DATE(YEAR(A2),MONTH(A2),30),B2),DATE(YEAR(A2),MONTH(A2),30))-MIN(DATE(YEAR(A2),MONTH(A2),30),A2)+1+MAX(((YEAR(B2)-YEAR(A2))*12+MONTH(B2)-MONTH(A2)-1)*30,0)+MIN(IF(AND(YEAR(B2)=YEAR(A2),MONTH(B2)=MONTH(A2)),0,B2-DATE(YEAR(B2),MONTH(B2),1)+1),30)

Мне нравится элегантность кода @Jeeped, но за этим может быть проще следовать.

0 голосов
/ 26 мая 2018

Мне кажется, что ваши примеры немного "шаткие", например, как 31-й счет иногда (например, дата начала / окончания), но не другие.

В любом случае, эта функция недовольно, но это делает трюк:

Function No31st(startDate As Date, endDate As Date) As Long
    Dim d As Date
    For d = startDate To endDate 'iterate each day in range
        If Day(d) <= 30 Then 'count days up to the 30th
            No31st = No31st + 1
            'if it's Feb 28, add 2 more days
            If (Month(d) = 2 And Day(d) = 28) Then
                No31st = No31st + 2 ' + Feb 29 + Feb 30
                If Day(d + 1) <> 1 Then d = d + 1 'leap year
            End If
        End If
    Next d
    'since the 31st counts if it's the last day:
    If Day(startDate) = 31 Or Day(endDate) = 31 Then No31st = No31st + 1
End Function

Пример вывода:

StartDate   endDate    result
10/4/2018   28/10/2018  199
31/1/2018   31/3/2018    61
28/2/2018   1/3/2018      4
28/2/2000   1/3/2000      4
31/1/2018   1/2/2018      2
0 голосов
/ 26 мая 2018

Попробуйте,

=SUMPRODUCT(--(DAY(ROW(INDIRECT(A2&":"&B2)))<>31))+
(DAY(A2)=31)+
 SIGN(SUMPRODUCT((MONTH(ROW(INDIRECT(A2&":"&B2)))=2)*(DAY(ROW(INDIRECT(A2&":"&B2)))=28)))*2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...