Access 中用于计算和显示日期/时间值的函数

http://support.microsoft.com/kb/210604
由于日期/时间值以双精度数字的形式存储,因此当您尝试在表达式中操作日期/时间值时,可能会得到格式有误的结果。本文演示如何创建表达式和自定义函数来显示特定日期以及计算时间间隔。

Microsoft 提供的编程示例只用于演示目的,不附带任何明示或暗示的保证。这包括但不限于对适销性或特定用途适用性的暗示保证。本文假定您熟悉所演示的编程语言以及用于创建和调试过程的工具。Microsoft 的支持工程师可以帮助解释某个特定过程的功能,但是他们不会修改这些示例以提供额外的功能或构建过程以满足您的特殊需求。
回到顶端 | 提供反馈
更多信息
显示特定的日期
要显示特定的日期,可以使用“DateSerial()”函数操作日期的日、月和年部分。例如,您可以在文本框的“ControlSource”属性或“即时”窗口中使用下列表达式,以返回特定的日期:

当前月份:
DateSerial(Year(Date()), Month(Date()), 1)
下一个月:
DateSerial(Year(Date()), Month(Date()) + 1, 1)
当前月份的最后一天:
DateSerial(Year(Date()), Month(Date()) + 1, 0)
下一个月的最后一天:
DateSerial(Year(Date()), Month(Date()) + 2, 0)
上一个月的第一天:
DateSerial(Year(Date()), Month(Date())-1,1)
上一个月的最后一天:
DateSerial(Year(Date()), Month(Date()),0)
当前季度的第一天:
DateSerial(Year(Date()), Int((Month(Date()) - 1) / 3) * 3 + 1, 1)
当前季度的最后一天:
DateSerial(Year(Date()), Int((Month(Date()) - 1) / 3) * 3 + 4, 0)
当前星期的第一天(假定星期日 = 第 1 天):
Date() - WeekDay(Date()) + 1
当前星期的最后一天:
Date() - WeekDay(Date()) + 7
当前星期的第一天(使用“选项”对话框中的设置):
Date() - WeekDay(Date(), 0) + 1
当前星期的最后一天:
Date() - WeekDay(Date(), 0) + 7

有关计算会计年度或会计月份的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
210249 如何在 Access 2000 中获取特定日期的会计年度或月份
警告:执行本示例中的步骤将会修改示例数据库 Northwind.mdb。您可能需要备份 Northwind.mdb 文件,并在该数据库的副本上执行这些步骤。

计算时间间隔
由于时间值是以 24 小时制的一部分存储的,因此当您尝试对大于 24 小时的时间数据进行加、减、乘或除运算时,可能会得到格式有误的结果。

例如,如果您尝试在 Visual Basic 中通过对值执行减法运算来求出两个日期之间经过的小时数,则可能会得到错误的数字。为演示此过程,请在“即时”窗口中键入以下代码(请注意:它将返回 0:00 值,而不是返回正确的值 53:00,单位为小时):

StartDate=#6/1/93 8:00AM#
EndDate=#6/3/93 1:00PM#
?Format(EndDate-StartDate,"hh:mm")


要解决因时间值大于 24 小时而导致的格式问题,您可以使用 Visual Basic 中的“Int()”和“CSng()”函数将计算的时间值分为不同的变量来表示天、小时、分钟和秒钟。例如,您可以在自定义函数中包括以下代码片断,以创建各个时间变量:

'-------------------------------------------------------------------
' This sample code separates a time interval into seven variables for
' the following values: days, hours, minutes, seconds, total time in
' hours, total time in minutes, and total time in seconds.
'
' The interval argument is flexible; it can be a single value, an
' expression, or a field reference.
'-------------------------------------------------------------------

Dim totalhours As Long, totalminutes As Long, totalseconds As Long
Dim days As Long, hours As Long, minutes As Long, seconds As Long
Dim interval As Variant

days = Int(CSng(interval))
totalhours = Int(CSng(interval * 24))
totalminutes = Int(CSng(interval * 1440))
totalseconds = Int(CSng(interval * 86400))
hours = totalhours Mod 24
minutes = totalminutes Mod 60
seconds = totalseconds Mod 60


您可以使用 totalhours、totalminutes 和 totalseconds 变量以单个时间单位的形式来显示时间值。利用 days、hours、minutes 和 seconds 变量,您可以将一个时间值分解为多个时间部分。要以不同的格式显示时间值,您可以按以下示例函数所示的方法将这些变量连接起来:

“GetElapsedDays()”函数计算两个日期/时间值之间经过的时间,并以天为单位显示结果。
“GetElapsedTime()”函数计算两个时间值之间经过的时间,并用天、小时、分钟和秒钟显示结果。
“GetTimeCardTotal()”函数对表中的时间值字段求和,并用小时和分钟显示总数。

GetElapsedDays() 示例函数
要创建“GetElapsedDays()”函数,请按照下列步骤操作:

打开示例数据库 Northwind.mdb。
创建一个模块,并在“声明”部分中键入下面一行内容(如果尚不存在此内容):

Option Explicit

键入以下函数:

Function GetElapsedDays (interval)
Dim days As Long

days = Int(CSng(interval))
GetElapsedDays = days & " Days "
End Function

要测试此函数,请基于 Orders 表新建一个查询。
在 QBE 网格中,请添加下列字段:

Field: ShippedDate
Show: True

Field: OrderDate
Show: True

Field: ElapsedTime: GetElapsedDays([ShippedDate]-[OrderDate])
Show: True

运行该查询。请注意,“ElapsedTime”列显示的是 Orders 表中每个记录的“ShippedDate”字段和“OrderDate”字段之间的天数。

GetElapsedTime() 示例函数
要创建“GetElapsedTime()”函数,请按照下列步骤操作:

使用以下结构创建一个新表,然后将其另存为 TimeLog。

表:TimeLog
-----------------------
Field Name: StartTime
Data Type: Date/Time
Format: General Date

Field Name: EndTime
Data Type: Date/Time
Format: General Date

在“数据表”视图中查看 TimeLog 表,输入下列三个记录,然后关闭该表:

StartTime EndTime
--------------------------------------------
5/10/95 4:57:00 PM 5/15/95 2:38:00 AM
5/11/95 10:17:31 AM 5/24/95 6:05:00 PM
5/18/95 9:16:43 AM 5/19/95 5:03:00 PM

创建一个模块,然后在“声明”部分中键入下面一行内容:

Option Explicit

输入以下函数:

Function GetElapsedTime(interval)

Dim totalhours As Long, totalminutes As Long, totalseconds As _
Long
Dim days As Long, hours As Long, Minutes As Long, Seconds As Long

days = Int(CSng(interval))
totalhours = Int(CSng(interval * 24))
totalminutes = Int(CSng(interval * 1440))
totalseconds = Int(CSng(interval * 86400))
hours = totalhours Mod 24
Minutes = totalminutes Mod 60
Seconds = totalseconds Mod 60

GetElapsedTime = days & " Days " & hours & " Hours " & Minutes & _
" Minutes " & Seconds & " Seconds "

End Function


注意:您需要向“GetElapsedTime”函数传递日期和时间。
要测试此函数,请使用“自动创建报表向导”来基于“TimeLog”表创建一个新报表。
在“设计”视图中查看该报表。
向 TimeLog 表的详细信息部分添加未绑定的文本框,然后按以下方法设置其属性:

Textbox
---------------
Name: ElapsedTime
ControlSource: =GetElapsedTime([EndTime]-[StartTime])
Width: 3 inches

预览报表。请注意,每个记录都用天、小时、分钟和秒钟显示经过的总时间。

GetTimeCardTotal() 示例函数
要创建“GetTimeCardTotal()”函数,请按照下列步骤操作:

注意:本文中的示例代码使用 Microsoft 数据访问对象。为使此代码正常运行,您必须引用 Microsoft DAO 3.6 对象库。为此,请在 Visual Basic 编辑器中单击“工具”菜单上的“引用”,并确保已选中“Microsoft DAO 3.6 对象库”复选框。

使用以下结构创建一个新表,然后将其另存为 TimeCard。

表:TimeCard
-----------------------
Field Name: Daily Hours
Data Type: Date/Time
Format: Short Time

在“数据表”视图中查看 TimeCard 表,输入下列四个记录,然后关闭该表:

8:15
7:37
8:12
8:03

创建一个模块,并在“声明”部分中键入下面一行内容(如果尚不存在此内容):

Option Explicit

键入以下函数:

Function GetTimeCardTotal ()

Dim db As DAO.Database, rs As DAO.Recordset
Dim totalhours As Long, totalminutes As Long
Dim days As Long, hours As Long, minutes As Long
Dim interval As Variant, j As Integer

Set db = dbengine.workspaces(0).databases(0)
Set rs = db.OpenRecordset("timecard")
interval = #12:00:00 AM#
While Not rs.EOF
interval = interval + rs![Daily hours]
rs.MoveNext
Wend
totalhours = Int(CSng(interval * 24))
totalminutes = Int(CSng(interval * 1440))
hours = totalhours Mod 24
minutes = totalminutes Mod 60

GetTimeCardTotal = totalhours & " hours and " & minutes & " minutes"

End Function

要测试此函数,请在“即时”窗口中键入下面一行内容,然后按 Enter:

?GetTimeCardTotal()


请注意,“即时”窗口中将显示 32 小时 7 分钟。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值