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

摘要

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

本文介绍以下主题:

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

更多信息

存储日期/时间数据

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

有效日期值范围为 -657,434 (年 1 月 1 日 100,) ,到 2,958,465 (9999 年 12 月 31 日,) 。 日期值 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 日 .96875 晚上 11:15:00
36836.125 36836 2000 年 11 月 6 日 .125 凌晨 3:00:00

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

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

结果等于:36298.5833333333

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

结果等于:-18278.7305555556

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

?CVDate (1.375)

结果等于:1899/12/31 上午 9:00:00

?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 05/15/1999 12:00:00 AM
0.546527777777778 下午 1:07 1899/12/30 下午 01:07:00
36232.9375 3/13/99 10:30PM 1999/03/13 10:30:00 PM

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

计算时间数据

由于时间值存储为一天 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 结果:

? 现在 () =DateValue (“3/31/1999”)

Now () 函数返回一个双精度数字,表示当前日期和当前时间。 但是,DateValue () 函数返回一个整数,该值表示日期而不是小数时间值。 因此,仅当 Now () 返回时间 00: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 PM#

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

References

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

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