閱讀英文

共用方式為


如何在 Microsoft Access 中儲存、計算及比較日期/時間數據

摘要

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

本文說明下列主題:

  • 儲存日期/時間數據
  • 格式化日期/時間欄位
  • 計算時間數據
  • 比較日期數據
  • 比較時間數據

其他相關資訊

儲存日期/時間數據

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

有效日期值的範圍從 -657,434 (100 A.D.) 100 到 2,958,465 (9999 年 12 月 31 日 A.D.) 。 日期值 0 代表 1899 年十二月 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 日 .5 下午 12:00:00
27468.96875 27468 1975 年三月 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.730555556

若要檢視數值的日期和時間,請在 [即時運算] 視窗中輸入下列命令,按 ENTER 鍵,然後注意結果:

?CVDate (1.375)

結果等於:12/31/1899 上午 9:00:00

?CVDate (-304398.575)

結果等於:8/1/1066 下午 1:48:00

格式化日期/時間欄位

您可以格式化日期/時間值,以顯示日期、時間或兩者。 當您使用僅限日期格式時,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
0.546527777777778 下午 1:07 12/30/1899 下午 01:07:00
36232.9375 3/13/99 10:30PM 03/13/1999 10:30:00 PM

注意 [日期/時間] 值的預設格式為 [一般日期]。 如果值是僅限日期,則不會出現任何時間。 如果值為僅限時間,則不會顯示日期。

計算時間數據

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

Microsoft 提供的程式設計範例僅供說明之用,並不具任何明示或暗示的責任擔保。 這包括 (但不限於) 任何目的之適售性及適用性的暗示責任擔保。 本文假設您熟悉示範的程式設計語言,也熟悉用以建立和偵錯程序的工具。 Microsoft 技術支援工程師可以協助說明特定程序的功能,但不會修改這些範例以提供附加功能或建構程序來滿足您的特定需求。 若要正確計算和格式化時間間隔,請遵循下列步驟:

  1. 建立模組,然後在 [宣告] 區段中,如果下列這一行尚未存在,請輸入下列這一行:

    Option Explicit

  2. 輸入下列程式:

    adoc
    '------------------------------------------------------------------
    '  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#)

請注意,下列值隨即出現:

adoc
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 () 。

若要在比較日期值時接收到正確的結果,請使用下列其中一個函數。 若要測試每個函式,請在 [實時運算] 視窗中輸入函式,將目前的日期取代為 3/31/1999,然後按 ENTER:

  • 若要傳回整數值,請使用 Date () 函式:

    ?Date () =DateValue (“3/31/1999”)

  • 若要移除 Now () 函式的小數部分,請使用 Int () 函式:

    ?Int (Now () ) =DateValue (“3/31/1999”)

比較時間數據

當您比較時間值時,可能會收到不一致的結果,因為時間值會儲存為雙精確度浮點數的小數部分。 例如,如果您在 [實時運算] 視窗中輸入下列表達式,即使兩個時間值看起來相同,您還是會收到誤 (0) 結果:

var1 = #2:01:00 PM#

var2 = DateAdd (“n”, 10, var1)

? var2 = #2:11:00 PM#

當 Access 將時間值轉換成分數時,計算結果可能與時間值不相同。 當您比較預存值與常數值時,計算所造成的小差異就足以產生誤 (0) 結果。

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

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

var1 = #1/1/99 下午 2:01:00#

var2 = DateAdd (“n”, 10, var1)

? var2 = #1/1/99 下午 2:11:00#

先將時間值轉換成字串資料類型,再進行比較:

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 屬性 - 日期/時間數據類型,然後按兩下 [搜尋] 以檢視主題。