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

备注

Office 365 ProPlus 正在重命名为 适用于企业的 Microsoft 365 应用。 有关此更改的详细信息, 请阅读此博客文章

摘要

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

本文介绍下列主题:

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

更多信息

存储日期/时间数据

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

有效日期值范围为 -657,434 (A.D.) 年 1 月 1 日到 9999 年 12 月 31 日 (2,958,465 ) 。 日期值 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 A.M.
2.5 2 1900 年 1 月 1 日 .5 12:00:00 P.M.
27468.96875 27468 1975 年 3 月 15 日 .96875 11:15:00 P.M.
36836.125 36836 2000 年 11 月 6 日 .125 3:00:00 A.M.

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

比较日期数据

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

? 现在 () =DateValue ("3/31/1999")

Now () 函数返回一个双精度数,该数字代表当前日期和当前时间。 但是,DateValue () 函数返回一个整数,该数字代表日期,而不是小数时间值。 因此, () 仅在 Now () 返回 00:00:00 (12:00:00 A.M.) 时,才将 Now () 等于 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 将时间值转换为分数时,计算的结果可能与时间值不同。 在将存储值与常量值进行比较时,计算 (0) 产生 false 值。

要在比较时间值时得到精确结果,请使用以下方法之一。 若要测试每个方法,请在"立即"窗口中键入每个方法,然后按 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

参考

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

若要详细了解如何设置日期/时间数据类型的格式,请单击"帮助"菜单上的 "Microsoft Access 帮助",在 Office 助手或应答向导中键入 format 属性 - 日期/时间 数据类型,然后单击"搜索"以查看主题。