我在 Access 2003 中有以下子来返回两个日期时间字段所经过的小时数。
Function DateDifferenceHour(dateStart As Date, dateEnd As Date) As String
'Outputs Hours from two dates
Dim age_hour As Double
age_hour = DateDiff("h", dateStart, dateEnd)
DateDifferenceHour = age_hour
End Function
如果我有以下条件:DateDifferenceHour("07/23/2005","07/23/2005 7:30:00 PM")
.
它正确返回 19 小时,但实际上,经过的时间是 19 小时 30 分钟。
如何修改它以使其可以四舍五入到 20 小时?
编辑:我最初的建议是"以分钟为单位计算差值,除以 60,然后将商四舍五入到小数点后零位"。 然而,@Jean-François Corbett向我展示了这种方法的局限性。
? DateDifferenceHour("07/23/2005 7:00:59 PM","07/23/2005 7:30:00 PM")
1
IOW 我的第一次尝试将持续时间四舍五入 29 分 1 秒到 1 小时,这不好。 因此,我建议使用以秒为单位的差异并除以 3600。
Function DateDifferenceHour2(dateStart As Date, dateEnd As Date) As String
'Outputs Hours from two dates
DateDifferenceHour2 = _
Format(DateDiff("s", dateStart, dateEnd) / 3600, "0")
End Function
? DateDifferenceHour2("07/23/2005 7:00:59 PM","07/23/2005 7:30:00 PM")
0
仍然存在您想要哪种舍入方法的问题。
我选择了 Format() 认为您希望 2.5 小时四舍五入为 3。
VBA Round()函数使用舍入到偶数,因此 Round(2.5, 0) 会给你 2。
我们不知道你想要哪个;你可以告诉我们。 此外,日期开始和日期结束意味着日期开始不会大于日期结束。 但是,如果可以,请考虑如何将负持续时间"舍入"到最接近的小时。 下面是从即时窗口复制的一些示例。
? Round(-2.5, 0)
-2
? Round(-1.5, 0)
-2
? Format(-2.5, "0")
-3
? Format(-1.5, "0")
-2
这有效,没有任何意外的舍入(除了Date
类型本身的精度)。
Function DateDifferenceHour(dateStart As Date, dateEnd As Date) As String
' Rounds .5's to nearest even integer.
'DateDifferenceHour = CStr( Round( _
' CDbl(dateEnd - dateStart) * 24 ) )
' Rounds .5's up.
DateDifferenceHour = Format( _
CDbl(dateEnd - dateStart) * 24, "0" )
End Function
我放了两个四舍五入的选项,使其四舍五入到整数;选择你最喜欢的。显式和透明地舍入比隐式DateDiff
应用其不寻常的舍入要好得多。