【问题标题】:Calculate date overlap in months以月计算日期重叠
【发布时间】:2020-04-30 10:12:52
【问题描述】:

如果您好心,需要一些帮助。

在 MS Excel 中,我试图根据学年计算出学生上大学的月数。

例如,学生在以下日期注册并完成大学学业:

  • 23/06/2018 - 23/06/2020

该学生有多个学年:

  • 01/08/2017 - 31/07/2018

  • 01/08/2018 - 31/07/2019

  • 01/08/2018 - 31/07/2020

我想计算学生每学年上学的月份数:

  • 01/08/2017 - 31/07/2018(1 个月)

  • 01/08/2018 - 31/07/2019(12 个月)

  • 01/08/2018 - 31/07/2020(11 个月)

我已经设法使用这个函数计算了天数:

=MAX(MIN(term_end_date, student_,end_date) - MAX(term_start_date, student_start_date)+1,0)

但是,如果可能的话,我需要几个月的时间。

提前感谢帮助。

【问题讨论】:

  • 您能否向我们展示您的数据的外观以及您的预期结果如何/在哪里?
  • 嗨,我通过编辑添加了屏幕转储。我也设法更接近解决方案:ROUNDDOWN(MAX(0,(MIN(term_end_date, student_end_date) - MAX(student_start_date, term_start_date)))/(365/12),0)
  • Jim 不会在 16/17 年学习 1 月和 17/18 月 12 月吗?
  • @JvdV - 更新了图片 - 输入错误的是 2017 年而不是 2018 年。
  • 你有更多的例子吗?我想我确实有答案,但想对您的数据进行更多测试

标签: excel date excel-formula


【解决方案1】:

=DATEDIF(A1,B1,”M”) 将给出在 A1 和 B1 中输入日期的两个日期(即不包括开始和结束月份)之间的整月数。 “M”表示您希望以月为单位报告信息。

要获得更多准确的结果,请尝试: =(DATEDIF(A1,B1,”D”) / 365) * 12. 如果日期跨越多年 - 包括闰年 - 尝试除以 365.25 和 365。

【讨论】:

  • 嗨,我已经查看了您的答案并之前尝试过 - 这无法交叉引用学术/学期。
【解决方案2】:

请试试这个 UDF。

Function MonthsOverlap(Rng As Range, _
                       AccYear As Integer) As String
    ' 016

    Const Ststart As Long = 1               ' index of array 'Study'
    Const Stend As Long = 2                 ' index of array 'Study'

    Dim Fun As Integer                      ' Months of overlap
    Dim YearStart As Date, YearEnd As Date
    Dim Study As Variant

    YearStart = DateSerial(AccYear, 8, 1)   ' modify year and day as required
    YearEnd = DateAdd("yyyy", 1, YearStart)
    Study = Rng.Value                       ' Rng columns must be adjacent

    With Application.WorksheetFunction
        If Study(1, Ststart) <= YearStart Then
            Fun = DateDiff("m", .Max(Study(1, Ststart), YearStart), .Min(Study(1, Stend), YearEnd))
        ElseIf Study(1, Ststart) <= YearEnd Then
             Fun = DateDiff("m", .Max(Study(1, Ststart), YearStart), YearEnd)
        End If
        Fun = .Max(Fun, 0)
    End With

    MonthsOverlap = Fun & " month" & IIf(Fun = 1, "", "s")
End Function

我在一张如下图所示的表格中对其进行了测试。请注意公式栏中的公式。

如您所见,该函数返回 2017 年和 2019 年的意外结果。我认为它们没有错。该公式仅使用与您的系统不同的月份四舍五入。我认为一旦您知道该功能,就可以修改该功能以适应您的规则。同时它遵循微软的规则,坦率地说,我也不知道。但是,请注意,学习的总时间是 24 个月,这是正确的,因此足以说服我让今天足够好:-)

【讨论】:

  • 对不起,还不够:/ 还是谢谢你。
  • 抱歉,这还不够:如果您有解决方案,请在此处发布作为您自己的答案。如果您没有,请与我一起进行四舍五入。 2017年学生学习了1个月零7天。您希望将此四舍五入为 1 个月。我的公式说他学习了两个月。该结果可以四舍五入,但您需要设置完成四舍五入的规则。您的问题中缺少此信息。
  • 嗨 Variatus - 我在下面发布了一个解决方案 :)
  • @史密斯特工先生谢谢。您的解决方案看起来非常好,但它不能解决舍入的任务。因此,可能并非它产生的所有结果都符合您的喜好。测试应包括少于半个月的日期,超过半个月的四舍五入,不需要四舍五入(出勤率和学年精确对齐)和正好半个月,即 14、15 和 16 天,具体取决于月份,在两端。这就是为什么我不想在没有你点头的情况下深入研究这个主题。但我确实建议您在高兴之前彻底测试。祝你好运!
【解决方案3】:

我找到了一个很好的解决方案:

感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 2017-11-26
    • 2015-08-25
    • 1970-01-01
    • 2015-06-20
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多