本主题说明 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 和帮助论坛。
另请参阅
- 访问开发人员论坛
- 访问 support.office.com 上的帮助
- 访问 UtterAccess 上的论坛
- 访问开发人员和 VBA 编程帮助中心 (FMS)
- 访问 StackOverflow 上的帖子
支持和反馈
有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。