ms 访问 - VBA:日期差异小时四舍五入



我在 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应用其不寻常的舍入要好得多。

相关内容

  • 没有找到相关文章

最新更新