计算运行时间

本主题说明 Access 如何存储日期/时间数据类型,以及为什么在计算或比较日期和时间时可能会收到意外结果。

存储日期/时间数据

Access 将日期/时间数据类型存储为双精度浮点数, (最多 15 位小数) 。 双精度数的整数部分表示日期;小数部分表示时间。

有效日期值范围为 -647,434 (100 年 1 月 1 日,) 到 2,958,465 (9999 年 12 月 31 日,A.D.) 。 日期值 0 表示 1899 年 12 月 30 日。 Access 将 1899 年 12 月 30 日之前的日期存储为负数。

有效时间的值范围是从 .0 (00:00:00) 到 .99999 (23:59:59)。 数字值是按天计算的。 将数字值乘以 24 可以将该数字值转换成小时、分钟和秒。

双精度数字 日期部分 实际日期 时间部分 实际时间
1.0 1 1899 年 12 月 31 日 .0 上午12:00:00
2.5 2 1900 年 1 月 1 日 .5 下午12:00:00
27468.96875 27468 1975 年 3 月 15 日 .96875 晚上 11:15:00
33914.125 33914 1992 年 11 月 6 日

计算时间数据

由于时间值存储为一天 24 小时的时间,因此当您计算的时间间隔大于 24 小时时,可能会得到格式不正确的结果。 要解决此行为,您可以创建一个用户定义的函数,以确保时间间隔的格式正确。

以下过程说明如何使用 Format 函数来设置时间间隔的格式。 此过程接受两个时间值,并将这两个值之间的间隔以几种不同的格式显示到“立即”窗口。

Function ElapsedTime(endTime As Date, startTime As Date) 
    Dim strOutput As String 
    Dim Interval As Date 
     
    ' Calculate the time interval. 
    Interval = endTime - startTime 
  
    ' Format and print the time interval in seconds. 
    strOutput = Int(CSng(Interval * 24 * 3600)) & " Seconds" 
    Debug.Print strOutput 
         
    ' Format and print the time interval in minutes and seconds. 
    strOutput = Int(CSng(Interval * 24 * 60)) & ":" & Format(Interval, "ss") _ 
        & " Minutes:Seconds" 
    Debug.Print strOutput 
     
    ' Format and print the time interval in hours, minutes and seconds. 
    strOutput = Int(CSng(Interval * 24)) & ":" & Format(Interval, "nn:ss") _ 
           & " Hours:Minutes:Seconds" 
    Debug.Print strOutput 
         
    ' Format and print the time interval in days, hours, minutes and seconds. 
    strOutput = Int(CSng(Interval)) & " days " & Format(Interval, "hh") _ 
        & " Hours " & Format(Interval, "nn") & " Minutes " & _ 
        Format(Interval, "ss") & " Seconds" 
    Debug.Print strOutput 
 
End Function

比较日期数据

由于日期和时间一起存储为双精度数,因此当您比较“日期/时间”数据时,可能会得到意外的结果。 例如,如果在"立即"窗口中键入以下表达式,即使当前日期为 2006 年 7 月 11 日,也会得到 False (0) 结果:

? Now()=DateValue("7/11/2006")

Now 函数返回一个表示当前日期和时间的双精度数。 但 DateValue 函数返回一个表示日期的整数,而不是小数时间值。 因此,仅当 Now 返回的时间为 00:00:00 (12:00:00 A.M.) 时, Now 才会等于 DateValue

要在比较日期值时得到精确结果,请使用以下函数之一。 要测试每个函数,请在"立即"窗口中键入该函数,将当前日期替换为 2006 年 7 月 11 日,然后按 Enter:

要返回整数值,请使用 Date 函数:

?Date()=DateValue("7/11/2006")

要删除 Now 函数的小数部分,请使用 Int 函数:

?Int(Now())=DateValue("7/11/2006")

比较时间数据

当您比较时间值时,可能会得到不一致的结果,因为时间值存储为双精度浮点数的小数部分。 例如,如果在“立即”窗口中键入以下表达式,即使两个时间值看起来相同,也会得到 False (0) 结果:

var1 = #2:01:00 PM# 
var2 = DateAdd("n", 10, var1) 
? var2 = #2:11:00 PM# 

当 Access 将时间值转换为分数时,计算结果可能不完全等效于时间值。 将存储的值与常量值进行比较时,计算引起的小的差别足以产生 False (0) 结果。

要在比较时间值时得到精确结果,请使用以下方法之一。 要测试每种方法,请在“立即”窗口中键入该方法,然后按 Enter:

向时间比较中添加关联日期:

var1 = #7/11/2006 2:00:00 PM# 
var2 = DateAdd("n", 10, var1) 
? var2 = #7/11/2006 2:10:00 PM#

比较时间值之前将它们转换成 String 数据类型:

var1 = #2:00:00 PM# 
var2 = DateAdd("n", 10, var1) 
? CStr(var2) = CStr(#2:10:00 PM#)

使用 DateDiff 函数比较精确单位(如秒):

var1 = #2:00:00 PM# 
var2 = DateAdd("n", 10, var1) 
? DateDiff("s", var2, #2:10:00 PM#) = 0

关于参与者

UtterAccess社区的社区成员图标提供的链接

UtterAccess 是主要的 Microsoft Access Wiki 和帮助论坛。

另请参阅

支持和反馈

有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。