共用方式為


計算經過的時間

本主題說明 Access 如何儲存日期/時間數據類型,以及當您計算或比較日期和時間時,為何可能會收到非預期的結果。

儲存日期/時間數據

Access 會將日期/時間數據類型儲存為雙精確度浮點數, (最多 15 個小數位數) 。 雙精度數字的整數部分代表日期,小數部分代表時間。

有效日期值的範圍從 -647,434 (100 年 1 月 1 日,A.D.) 到 2,958,465 (9999 年 12 月 31 日,A.D.) 。 日期值 0 代表 1899 年十二月 30 日。 Access 會將 1899 年 12 月 30 日的日期儲存為負數。

有效時間值的範圍從 .0 (00:00:00) 到 .99999 (23:59:59) 。 數值代表一天的分數。 您可以將數值乘以 24,將數值轉換成小時、分鐘和秒。

雙精度浮點數 日期部分 實際日期 時間部分 實際時間
1.0 1 1899 年十二月 31 日 .0 上午 12:00:00
2.5 2 1900 年一月 1 日 .5 下午 12:00:00
27468.96875 27468 1975 年三月 15 日 .96875 下午 11:15:00
33914.125 33914 1992 年十一月 6 日

計算時間數據

因為時間值會儲存為一天 24 小時的分數,所以如果您計算的時間間隔大於 24 小時,可能會收到不正確的格式設定結果。 若要解決此問題,可以建立使用者定義的函數,以確保時間間隔的格式設定正確。

下列程序說明如何使用 Format 函數設定時間間隔的格式。 此程序接受兩個時間值,並且會在 [即時運算] 視窗中以數種不同格式顯示這兩個時間的間隔。

Function ElapsedTime(endTime As Date, startTime As Date) 
    Dim strOutput As String 
    Dim Interval As Date 
     
    ' Calculate the time interval. 
    Interval = endTime - startTime 
  
    ' Format and print the time interval in seconds. 
    strOutput = Int(CSng(Interval * 24 * 3600)) & " Seconds" 
    Debug.Print strOutput 
         
    ' Format and print the time interval in minutes and seconds. 
    strOutput = Int(CSng(Interval * 24 * 60)) & ":" & Format(Interval, "ss") _ 
        & " Minutes:Seconds" 
    Debug.Print strOutput 
     
    ' Format and print the time interval in hours, minutes and seconds. 
    strOutput = Int(CSng(Interval * 24)) & ":" & Format(Interval, "nn:ss") _ 
           & " Hours:Minutes:Seconds" 
    Debug.Print strOutput 
         
    ' Format and print the time interval in days, hours, minutes and seconds. 
    strOutput = Int(CSng(Interval)) & " days " & Format(Interval, "hh") _ 
        & " Hours " & Format(Interval, "nn") & " Minutes " & _ 
        Format(Interval, "ss") & " Seconds" 
    Debug.Print strOutput 
 
End Function

比較日期數據

因為時間及日期一起儲存為雙精度數字,所以在比較 [日期/時間] 資料時,可能會接收到非預期的結果。 比方說,如果在 [即時運算] 視窗中輸入下列運算式,則即使今天的日期是 7/11/2006,您也會接收到 False (0) 結果:

? Now()=DateValue("7/11/2006")

Now 函數會傳回一個代表目前日期及時間的雙精度數字。 但是, DateValue 函數所傳回的是代表日期的整數數字,而不是分數形式的時間值。 因此,只有在 Now 傳回時間 00:00:00 (12:00:00 A.M.) 時, Now 才會等於 DateValue

若要在比較日期值時接收到正確的結果,請使用下列其中一個函數。 若要測試每個函數,請在 [即時運算] 視窗中輸入各個函數,替代目前日期 7/11/2006,然後按 ENTER 鍵:

若要傳回整數值,請使用 Date 函數:

?Date()=DateValue("7/11/2006")

若要移除 Now 函數的分數部分,請使用 Int 函數:

?Int(Now())=DateValue("7/11/2006")

比較時間數據

因為時間值儲存為雙精度浮點數的分數部分,所以在比較時間值的時候,可能會接收到不一致的結果。 比方說,如果在 [即時運算] 視窗中輸入下列運算式,則即使兩個時間值看起來一樣,仍然會接收到 False (0) 結果:

var1 = #2:01:00 PM# 
var2 = DateAdd("n", 10, var1) 
? var2 = #2:11:00 PM# 

當 Access 將時間值轉換成分數時,計算結果可能與時間值不完全相等。 當比較儲存的值與常數值時,計算中產生的小誤差足以導致 False (0) 結果。

若要在比較時間值時接收到正確的結果,請使用下列其中一種方法。 若要測試每個方法,請在 [即時運算] 視窗中輸入各個方法,然後按 ENTER 鍵:

新增相關日期至時間比較:

var1 = #7/11/2006 2:00:00 PM# 
var2 = DateAdd("n", 10, var1) 
? var2 = #7/11/2006 2:10:00 PM#

進行比較之前,將時間值轉換為 String 資料類型:

var1 = #2:00:00 PM# 
var2 = DateAdd("n", 10, var1) 
? CStr(var2) = CStr(#2:10:00 PM#)

使用 DateDiff 函數比較精準度單位,例如秒:

var1 = #2:00:00 PM# 
var2 = DateAdd("n", 10, var1) 
? DateDiff("s", var2, #2:10:00 PM#) = 0

關於參與者

UtterAccess 社群的社群成員圖示所提供的連結

UtterAccess 是最早的 Microsoft Access Wiki 和說明論壇。

另請參閱

支援和意見反應

有關於 Office VBA 或這份文件的問題或意見反應嗎? 如需取得支援服務並提供意見反應的相關指導,請參閱 Office VBA 支援與意見反應