如果使用Excel的< code>YEARFRAC(date1,date2,1)函数,则Excel将按照第二个参数使用基数。如果日期1和日期2在同一年,这没有关系,但如果日期1是闰年(例如2020年)而日期2是非闰年(例如2021年),这就有关系了
我认为更准确的计算应该考虑到< code>date1的基数可能不同于< code>date2的基数。
例如,< code>YEARFRAC(15/12/2020,15/01/2021,1)返回< code>0.08493151,但实际计算结果是< code >(31/12/2020-15/12/2020)/366(15/01/2020-31/12/2020)/365 = 0.084811737
我在VBA中实现了以下内容。有人有更好的方法吗(在Excel或VBA中)?(我不希望对我匆忙的VBA代码进行细微的改进)
使用< code>yearFracVBA("AA1 "," AA2")调用它
Function yearFracVBA(aDate1, aDate2)
result = 0
y1 = Application.Evaluate("=YEAR(" & aDate1 & ")")
y2 = Application.Evaluate("=YEAR(" & aDate2 & ")")
For Y = y1 To y2
fraction = 0
If Y = y1 And Y = y2 Then fraction = Application.Evaluate("=YEARFRAC(" & aDate1 & "," & aDate2 & ",1)")
If Y = y1 And Y < y2 Then fraction = Application.Evaluate("=YEARFRAC(" & aDate1 & ",DATE(YEAR(" & aDate1 & "),12,31),1)")
If Y > y1 And Y < y2 Then fraction = 1
If Y > y1 And Y = y2 Then fraction = Application.Evaluate("=YEARFRAC(DATE(YEAR(" & aDate2 & ")-1,12,31)," & aDate2 & ",1)")
result = result + fraction
Next Y
yearFracVBA = result
End Function
如果您不想使用VBA,那么在Excel中您可以使用以下公式:
=ABS(A1,12个月,1)年(B1)-年(A1)-1年(B1,EO月(B1,1个月), 1))
其中A1和B1是包含2个日期的单元格
以下代码不需要Excel。它可以在任何VBA应用程序中工作:
Option Explicit
Public Function YearFracActual(ByVal aDate1 As Date, ByVal aDate2 As Date) As Double
Dim lowerDate As Date
Dim upperDate As Date
Dim year1 As Integer
Dim year2 As Integer
'Get dates in order
If aDate1 > aDate2 Then
lowerDate = aDate2
upperDate = aDate1
Else
lowerDate = aDate1
upperDate = aDate2
End If
'Round down (floor) - exclude any time (hours, minutes, seconds)
lowerDate = VBA.Int(lowerDate)
upperDate = VBA.Int(upperDate)
'Get years
year1 = Year(lowerDate)
year2 = Year(upperDate)
If year1 = year2 Then
YearFracActual = (upperDate - lowerDate) / GetDaysInYear(year1)
Else
Dim lowerFrac As Double
Dim upperFrac As Double
Dim midFrac As Double
lowerFrac = (DateSerial(year1, 12, 31) - lowerDate) / GetDaysInYear(year1)
midFrac = year2 - year1 - 1
upperFrac = (upperDate - DateSerial(year2 - 1, 12, 31)) / GetDaysInYear(year2)
YearFracActual = lowerFrac + midFrac + upperFrac
End If
End Function
Private Function GetDaysInYear(ByVal year_ As Integer) As Integer
If IsLeapYear(year_) Then
GetDaysInYear = 366
Else
GetDaysInYear = 365
End If
End Function
Private Function IsLeapYear(ByVal year_ As Integer) As Boolean
If year_ Mod 400 = 0 Then
IsLeapYear = True
ElseIf year_ Mod 100 = 0 Then
IsLeapYear = False
Else
IsLeapYear = (year_ Mod 4 = 0)
End If
End Function
键入结束年度:2013 2008年是闰年 2012年是闰年 非常感谢您的回复!帮助我学到了比我的讲师实际教的更多的东西:)
该表包含每个月的内容:第一天、最后一天以及这两天之间的天数。 预期成果: /** 英国标准时间2016年9月30日(星期五)00:00:00-英国标准时间2016年10月29日(星期六)23:59:59 2016年10月30日太阳00:00:00英国标准时间2016年11月29日星期二23:59:59 GMT 2016-31 格林尼治时间2016年11月30日00:00:00-格林尼治时间2016
问题内容: 我想计算两个日期之间的年数。 例如:- 这将导致335天。我想用几年来展示,这将是几年。 问题答案: 只需执行此操作(除以 365.242199 ): 1年= 365.242199天 或者 使用MONTHS_BETWEEN尝试类似的事情:- 或者您也可以尝试以下方法: 335 / 365.242199 = 0.917199603,而不是.97
我目前正在做一个报告,我想找出两个日期之间的月份。我目前有这个 =(DATEDIF(U224, V224,"m")1) 然而,我希望它添加另一个元素,如果初始日期是在本月15日或之前,如果是16日,则会四舍五入,之后会四舍六入。 例如,第一个日期是2月13日,第二个日期是6月31日。它将带回5个月。然而,如果第一次约会是2月20日,则会提前4个月。 提前谢谢
问题内容: 我对MYSQL函数有问题,我可以使用它,而且很简单。但是我不明白如何使用它来收集表字段中的差异。例如 我有一列,我想写一个查询来做类似的事情 我的意思是我要从当前日期时间到table字段的差额,每个查询结果都是差额,即用户的年龄。 问题答案: 你的意思是这样吗? (来源)
我试图在我正在创建的C#应用程序中显示两个日期之间的年、月和日。(使用控制台进行测试) 我正在使用NodaTime来实现这一点,但在接下来的几个月里,我遇到了一些问题。 我已经阅读了这里的大部分问题和答案,但没有找到任何我可以从中受益的东西。 大多数时候函数工作但有时它不添加月如果天 我使用这个代码进行测试 (2017, 10, 16)和(2018, 1, 15)应该显示为3个月,但它们显示为2个