VBA:DateDiff小时圆满结束

时间:2011-05-06 21:05:23

标签: vba ms-access datetime access-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 小时?

2 个答案:

答案 0 :(得分:3)

修改: 我的原始建议是“以分钟计算差异,除以60,并将商数舍入为零小数位”。然而,@ Jean-FrançoisCorbett向我展示了这种方法的局限性。

? 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-to-even,所以Round(2.5,0)会给你2.

我们不知道你想要哪个;你可以告诉我们。此外,dateStart和dateEnd暗示dateStart不会大于dateEnd。但是,如果可以,请考虑如何将负时间“舍入”到最接近的小时。以下是从立即窗口复制的一些示例。

? Round(-2.5, 0)
-2 
? Round(-1.5, 0)
-2 
? Format(-2.5, "0")
-3
? Format(-1.5, "0")
-2

答案 1 :(得分: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隐式应用其不寻常的舍入相比,明确且透明地进行舍入是一种更好的编程习惯。