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