Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access VBA:DateDiff小时四舍五入_Ms Access_Datetime_Vba - Fatal编程技术网

Ms access VBA:DateDiff小时四舍五入

Ms access VBA:DateDiff小时四舍五入,ms-access,datetime,vba,Ms Access,Datetime,Vba,在Access 2003中,我使用以下子项返回两个datetime字段之间经过的小时数 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

在Access 2003中,我使用以下子项返回两个datetime字段之间经过的小时数

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
依我看,我的第一次尝试将持续时间从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
编辑: 我最初的建议是“以分钟为单位计算差值,除以60,然后将商四舍五入到小数点后零位”。然而,@Jean-François Corbett向我展示了这种方法的局限性

? DateDifferenceHour("07/23/2005 7:00:59 PM","07/23/2005 7:30:00 PM")
1
依我看,我的第一次尝试将持续时间从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

这是可行的,没有任何意外的舍入(除了
日期
类型本身的精度)


我设置了两个舍入选项,以便将其舍入为整数;选择你最喜欢的。与
DateDiff
隐式应用其不寻常的舍入相比,显式透明舍入是更好的编程实践

这是有效的,没有任何意外的四舍五入(除了日期的精度之外)


我设置了两个舍入选项,以便将其舍入为整数;选择你最喜欢的。与
DateDiff
隐式应用其不寻常的舍入相比,显式透明舍入是更好的编程实践

尽管这将以“@Rick”的原始函数以分钟取整差异的方式,以秒取整任何差异。也许接受这种有趣的舍入行为是“小英语”?我不知道。@Jean-François Corbett我不明白为什么秒对于Rick想要的东西很重要。输入值的例子是29分01秒到1小时:
DateDifferenceHour(“07/23/2005 7:00:59 PM”,“07/23/2005 7:30:00 PM”)
。请注意,您的
DateDifferenceHour2
会减少但不会消除问题;同样的问题将适用于
DateDifferenceHour
中的一分钟分数,以及OP原始函数中的一小时分数。我认为没有理由先验地认为这无关紧要,但也许OP可以忍受其应用程序的这种不精确程度。我不知道。@Jean-François Corbett谢谢,这正是我需要的。我修改了我的答案。我会很感激你能如此清晰地看到你所发现的任何缺点。尽管这会在几秒钟内消除任何差异,就像@Rick最初的函数在几分钟内消除差异一样。也许接受这种有趣的舍入行为是“小英语”?我不知道。@Jean-François Corbett我不明白为什么秒对于Rick想要的东西很重要。输入值的例子是29分01秒到1小时:
DateDifferenceHour(“07/23/2005 7:00:59 PM”,“07/23/2005 7:30:00 PM”)
。请注意,您的
DateDifferenceHour2
会减少但不会消除问题;同样的问题将适用于
DateDifferenceHour
中的一分钟分数,以及OP原始函数中的一小时分数。我认为没有理由先验地认为这无关紧要,但也许OP可以忍受其应用程序的这种不精确程度。我不知道。@Jean-François Corbett谢谢,这正是我需要的。我修改了我的答案。如果您能如此清楚地看到您发现的任何缺点,我将不胜感激。我假设您知道,VBA Round()函数使用银行舍入,并将负数向上舍入(而不是绝对值,这是您在信用备忘录等情况下所需要的)。@Rick如果时差为20.5小时,您希望返回值为20还是21?此函数将返回20,其中包含
DateDifferenceHour2(“07/23/2005”,“07/23/2005 8:30:00 PM”)
。。。修正赋值后,
DateDifferenceHour=
@Rick:前面的注释适当地提请注意VBA的舍入算法:
Round
(和
CInt
)将.5舍入到最接近的偶数整数。(其他所有内容都按预期四舍五入到最接近的整数。)如果您不喜欢这种行为,则有一些变通方法。谢谢。如果它是20.5,我希望它四舍五入到21。只是好奇为什么要使用CDbl()。把它变成