因為日期/時間值是以雙精度數字儲存,所以當您嘗試在運算式中操作日期/時間值時,可能會得到不正確的格式結果。本文將示範如何建立運算式和自訂函數,以顯示特定的日期和計算時間間隔。
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?
(http://support.microsoft.com/kb/210249/
)
How to get the fiscal year or month of a particular date in 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 Bacis 中的
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。
- 建立模組,如果宣告區段中還沒有下面這一行,請輸入這一行:
- 輸入下列函數:
Function GetElapsedDays (interval)
Dim days As Long
days = Int(CSng(interval))
GetElapsedDays = days & " Days "
End Function - 若要測試此函數,請根據 Orders 資料表建立新的查詢。
- 在 QBE 方格中,加入下列欄位。
欄位:ShippedDate
顯示:True
欄位:OrderDate
顯示:True
欄位:ElapsedTime:GetElapsedDays([ShippedDate]-[OrderDate])
顯示:True
- 執行查詢。請注意,ElapsedTime 資料行會顯示 Orders 資料表中每一個記錄的 ShippedDate
欄位和 OrderDate 欄位之間的天數。
GetElapsedTime() 範例函數
若要建立
GetElapsedTime() 函數,請依照下列步驟執行:
- 建立具有下列結構的新資料表,並將其儲存為 TimeLog。
資料表:TimeLog
-----------------------
欄位名稱:StartTime
資料類型:日期/時間
格式:General Date
欄位名稱:EndTime
資料類型:日期/時間
格式: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 |
- 建立模組,並在宣告區段中輸入下面這一行:
- 輸入下列函數:
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 資料表的詳細區段中加入未結合文字方塊,並設定其屬性如下:
文字方塊
---------------
名稱:ElapsedTime
控制項資料來源:=GetElapsedTime([EndTime]-[StartTime])
寬度:3 英吋 - 預覽報表。請注意,每個記錄都會以天數、小時數、分鐘數及秒數來顯示總共經過時間。
GetTimeCardTotal() 範例函數
若要建立
GetTimeCardTotal() 函數,請依照下列步驟執行:
注意:本文中的範例程式碼使用 Microsoft Data Access Objects。您必須引用 Microsoft DAO 3.6
Object Library,此程式碼才能正確地執行。如果要執行這項操作,請按一下 Visual Basic 編輯器之
[工具] 功能表上的
[參照],然後確定已選取
[Microsoft DAO 3.6 Object Library] 核取方塊。
- 建立具有下列結構的新資料表,並將其儲存為 TimeCard。
資料表:TimeCard
-----------------------
欄位名稱:Daily Hours
資料類型:日期/時間
格式:簡短時間 - 在 [資料工作表檢視] 中檢視 TimeCard 資料表,輸入下列四個記錄,然後關閉資料表:
- 建立模組,如果宣告區段中還沒有下面這一行,請輸入這一行:
- 輸入下列函數:
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:
請注意,即時運算視窗中會顯示 32 小時又 7 分鐘。
如需有關計算日期/時間值的詳細資訊,請按一下下面的文件編號,檢視「Microsoft
知識庫」中的文件:
210276?
(http://support.microsoft.com/kb/210276/
)
How to store, calculate, and compare Date/Time data in Microsoft Access