如何在 Microsoft Access 中存储、计算和比较日期/时间数据

概要

本文介绍如何Microsoft Access 存储日期/时间数据类型。 本文还介绍了计算日期和时间或比较日期和时间时可能会收到意外结果的原因。

本文介绍以下主题:

  • 存储日期/时间数据
  • 设置日期/时间字段的格式
  • 计算时间数据
  • 比较日期数据
  • 比较时间数据

详细信息

存储日期/时间数据

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

有效日期值从 -657,434(A.D.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,可以将数值转换为小时、分钟和秒。

下表显示了 Access 如何存储日期/时间值:

重复数字 日期部分 实际日期 时间部分 实际时间
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 日 0.96875 晚上 11:15:00
36836.125 36836 2000 年 11 月 6 日 .125 上午 3:00:00

若要查看 Access 如何将日期/时间值存储为数字,请在“立即”窗口中键入以下命令,按 Enter,然后注意结果:

?CDbl(#5/18/1999 14:00:00#)

结果等于:36298.583333333

?CDbl(#12/14/1849 17:32:00#)

结果等于:-18278.7305555556

若要查看数值的日期和时间,请在“立即”窗口中键入以下命令,按 Enter,然后注意结果:

?CVDate(1.375)

结果等于:12/31/1899 9:00:00 AM

?CVDate(-304398.575)

结果等于:8/1/1066 1:48:00 PM

设置日期/时间字段的格式

您可以设置日期/时间值的格式以显示日期、时间或两者。 使用仅限日期的格式时,Access 存储时间部分的值为 0。 使用仅限时间的格式时,Access 存储日期部分的值为 0。

下表显示了 Access 如何存储日期/时间值。 下表还显示了如何使用不同的格式显示这些值:

存储值 (双数字) 默认格式(常规日期) 自定义格式(mm/dd/yyyy hh:nn:ss A.M./P.M.)
36295.0 5/15/99 1999/05/15 上午 12:00:00
0.546527777777778 下午 1:07 12/30/1899 01:07:00 PM
36232.9375 3/13/99 22:30 1999年03月13日 22:30:00

注意 日期/时间值的默认格式为“常规日期”。 如果值仅为日期,则不会显示时间。 如果该值是仅限时间的,则不会显示日期。

计算时间数据

由于时间值存储为 24 小时天的一小部分,因此在计算大于 24 小时的时间间隔时,可能会收到不正确的格式设置结果。 若要解决此问题,可以创建用户定义的函数,以确保正确设置时间间隔的格式。

Microsoft 提供的编程示例仅用于进行说明,而不提供明示或默示担保。 这包括但不限于适销性或对特定用途的适用性的默示担保。 本文假设您熟悉正在演示的编程语言和用于创建和调试过程的工具。 Microsoft 支持工程师可以帮助解释特定过程的功能,但他们不会修改这些示例以提供新增功能或构建步骤以满足你的特定需要。 若要正确计算和设置时间间隔的格式,请执行以下步骤:

  1. 创建一个模块,然后在“声明”部分中键入以下行(如果以下行尚不存在):

    Option Explicit

  2. 请键入以下步骤:

    '------------------------------------------------------------------
    '  This function calculates the elapsed time between two values and then
    '  formats the result in four different ways.
    '
    '  The function accepts interval arguments such as the following:
    '
    '     #5/12/95 6:00:00AM# - #5/11/95 10:00:00PM#
    '
    '
    '
    '     [End Time]-[Start Time]
    '------------------------------------------------------------------
    
    Function ElapsedTime (Interval)
      Dim x
      x = Int(CSng(Interval * 24 * 3600)) & " Seconds"
      Debug.Print x
      x = Int(CSng(Interval * 24 * 60)) & ":" & Format(Interval, "ss") _
         & " Minutes:Seconds"
      Debug.Print x
      x = Int(CSng(Interval * 24)) & ":" & Format(Interval, "nn:ss") _
         & " Hours:Minutes:Seconds"
      Debug.Print x
      x = Int(CSng(Interval)) & " days " & Format(Interval, "hh") _
         & " Hours " & Format(Interval, "nn") & " Minutes " & _
         Format(Interval, "ss") & " Seconds"
      Debug.Print x
    
    End Function
    
  3. 在“即时”窗口中键入以下行,然后按 Enter:

    ? ElapsedTime(#6/1/1999 8:23:00PM#-#6/1/1999 8:12:12AM#)

请注意,将显示以下值:

43848 Seconds
730:48 Minutes:Seconds
12:10:48 Hours:Minutes:Seconds
0 days 12 Hours 10 Minutes 48 Seconds

比较日期数据

由于日期和时间作为双精度数字一起存储,因此在比较日期/时间数据时可能会收到意外结果。 例如,如果在“即时”窗口中键入以下表达式,则即使今天的日期为 1999 年 3 月 31 日,也会收到 False 结果:

? Now()=DateValue(“3/31/1999”)

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

若要在比较日期值时接收准确的结果,请使用以下函数之一。 若要测试每个函数,请在“立即”窗口中键入该函数,将当前日期替换为 1999 年 3 月 31 日,然后按 Enter:

  • 若要返回整数值,请使用 Date() 函数:

    ?Date()=DateValue(“3/31/1999”)

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

    ?Int(Now()=DateValue(“3/31/1999”)

比较时间数据

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

var1 = #2:01:00 PM#

var2 = DateAdd(“n”, 10, var1)

? var2 = #2:11:00 PM#

当 Access 将时间值转换为分数时,计算结果可能与时间值不同。 在将存储值与常量值进行比较时,计算引起的小差异足以生成 false (0) 结果。

若要在比较时间值时接收准确的结果,请使用以下方法之一。 若要测试每个方法,请在“立即”窗口中键入每个方法,然后按 Enter:

将关联的日期添加到时间比较:

var1 = #1/1/99 下午 2:01:00#

var2 = DateAdd(“n”, 10, var1)

? var2 = #1/1/99 2:11:00 PM#

在比较时间值之前,请将时间值转换为字符串数据类型:

var1 = #2:01:00 PM#

var2 = DateAdd(“n”, 10, var1)

? CStr(var2) = CStr(#2:11:00 PM#)

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

var1 = #2:01:00 PM#

var2 = DateAdd(“n”, 10, var1)

? DateDiff(“s”, var2, #2:11:00 PM#) = 0

参考文献

有关计算日期值和时间值的详细信息,请参阅 DateSerial 函数

有关如何格式化日期/时间数据类型的详细信息,请在“帮助”菜单上单击“Microsoft Access 帮助”,在 Office 助手或解答向导中键入“格式属性 - 日期/时间 数据类型”,然后单击“搜索”以查看相关主题。