Lagra, beräkna och jämföra datum-/tidsdata i Microsoft Access

Anteckning

Office 365 ProPlus byter namn till Microsoft 365-appar för företag. Mer information om den här ändringen finns i det här blogginlägget.

Sammanfattning

I den här artikeln beskrivs hur datatypen Datum/tid lagras i Microsoft Access. I den här artikeln beskrivs också varför du kan få oväntade resultat när du beräknar datum och tider eller jämför datum och tider.

I den här artikeln beskrivs följande avsnitt:

  • Lagra datum-/tidsdata
  • Formatera datum/tid-fält
  • Beräkna tidsdata
  • Jämföra datumdata
  • Jämföra tidsdata

Mer information

Lagra datum-/tidsdata

Datatypen Datum/tid lagras som ett flyttal med dubbel precision upp till 15 decimaler. Heltalsdelen av talet med dubbel precision representerar datumet. Decimaldelen representerar tiden.

Giltiga datumvärden ligger mellan -657 434 (1 januari 100 e.Kr.) och 2 958 465 (31 december 9999). Datumvärdet 0 motsvarar 30 december 1899. I Access lagras datum före den 30 december 1899 som negativa tal.

Giltiga tidsvärden ligger mellan 0,0 (00:00:00) och 0,99999 (23:59:59). Det numeriska värdet representerar ett bråk av en dag. Du kan konvertera det numeriska värdet till timmar, till minuter och till sekunder genom att multiplicera det numeriska värdet med 24.

I följande tabell visas hur datum/tid-värden lagras i Access:

Dubbelt nummer Datumdel Verkligt datum Tidsdelen Faktisk tid
1.0 1 31 december 1899 .0 00:00.
2.5 2 1 januari 1900 .5 12:00:00.
27468.96875 27468 15 mars 1975 .96875 23:15: 00.
36836.125 36836 6 november 2000 .125 03:00:00.

Om du vill se hur Access lagrar datum/tid-värden som tal skriver du följande kommandon i direktfönstret, trycker på RETUR och märker sedan resultaten:

? CDbl(#1999-05-18 14:00:00#)

Resultatet är lika med: 36298,583333333

? CDbl(#14-12-14 17:32:00#)

Resultatet är lika med: -18278,730555556

Om du vill visa datum och tid för numeriska värden skriver du följande kommandon i direktfönstret, trycker på RETUR och märker sedan resultaten:

? CvDate(1,375)

Resultatet är lika med: 1899-12-31 09:00:00

? CvDate(-304398.575)

Resultatet är lika med: 1066-08-01 1:48:00

Formatera datum/tid-fält

Du kan formatera ett datum/tid-värde om du vill visa ett datum, en tid eller både och. När du använder ett datumformat lagras värdet 0 för tidsdelen. När du använder ett tidsformat lagras värdet 0 för datumdelen.

I följande tabell visas hur datum/tid-värden lagras i Access. I följande tabell visas också hur du kan visa dessa värden genom att använda olika format:

Lagrat värde (dubbelt tal) Standardformat (Allmänt datum) Anpassat format (mm/dd/yyyy hh:nn:ss A.M./P.M.)
36295.0 5/15/99 1999-05-15 12:00:00
0.546527777777778 13:07 1899-12-30 14:07:00
36232.9375 3/13/99 10:30 PM 1999-13-13 10:30:00

Obs! Standardformatet för ett datum-/tidsvärde är Allmänt datum. Om ett värde endast är datum visas ingen tid. Om värdet endast är tidsent, visas inget datum.

Beräkna tidsdata

Eftersom ett tidsvärde lagras som en decimal av en 24-timmarsdag kan du få felaktiga formateringsresultat när du beräknar tidsintervaller som är längre än 24 timmar. Du kan komma runt det här problemet genom att skapa en användardefinierad funktion för att se till att tidsintervallen är rätt formaterade.

Microsoft tillhandahåller programmeringsexempel enbart i förklarande syfte och gör inga utfästelser, varken uttryckligen eller underförstått. Detta omfattar men begränsas inte till underförstådd garanti för säljbarhet eller lämplighet för ett visst syfte. I denna artikel förutsätts att du känner till det programmeringsspråk som demonstreras och de verktyg som används för att skapa och felsöka procedurer. Microsofts supportexperter kan hjälpa till att förklara funktionerna i en viss procedur, men de kommer inte att ändra dessa exempel för att tillhandahålla extra funktioner eller konstruera procedurer för att uppfylla dina specifika behov. Gör så här för att beräkna och formatera tidsintervall på rätt sätt:

  1. Skapa en modul och skriv sedan följande rad i avsnittet Deklarationer om följande rad inte redan finns där:

    Option Explicit

  2. Skriv in följande procedur:

    '------------------------------------------------------------------
    '  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. Skriv följande rad i direktfönstret och tryck sedan på RETUR:

    ? ElapsedTime(#1999-06-01 08:23:00PM#-#1999-06-01 08:12:12#)

Observera att följande värden visas:

43848 Seconds
730:48 Minutes:Seconds
12:10:48 Hours:Minutes:Seconds
0 days 12 Hours 10 Minutes 48 Seconds

Jämföra datumdata

Eftersom datum och tider lagras tillsammans som tal med dubbel precision kan du få oväntade resultat när du jämför datum/tid-data. Om du till exempel skriver följande uttryck i direktfönstret får du falskt resultat även om dagens datum är 1999-03-31:

? Now()=DateValue("1999-03-31")

Funktionen Now() returnerar ett tal med dubbel precision som representerar dagens datum och aktuell tid. Funktionen DatumVärde() returnerar emellertid ett heltal som representerar datumet men inte ett bråktal. Därför är Nu() bara lika med DatumVärde() när Nu() returnerar en tid från 00:00:00 (00:00:00).

Använd någon av följande funktioner för att få korrekta resultat när du jämför datumvärden. Om du vill testa varje funktion skriver du funktionen i direktfönstret, ersätter dagens datum med 1999-03-31 och trycker sedan på RETUR:

  • Om du vill returnera ett heltalsvärde använder du funktionen Datum():

    ? Datum()=Datumvärde("1999-03-31")

  • Om du vill ta bort decimalerna i funktionen Nu() använder du funktionen Heltal():

    ? Int(Now())=DateValue("1999-03-31")

Jämföra tidsdata

När du jämför tidsvärden kan du få inkonsekventa resultat eftersom ett tidsvärde lagras som decimaldelen av ett flyttal med dubbel precision. Om du till exempel skriver följande uttryck i direktfönstret får du ett falskt resultat (0) även om de två tidsvärdena ser likadana ut:

var1 = #14:01:00 #

var2 = DatumAdd("n", 10, var1)

? var2 = #14:11:00 #

När ett tidsvärde konverteras till ett bråktal kanske det beräknade resultatet inte är identiskt med tidsvärdet. Den lilla skillnaden som orsakas av beräkningen är tillräcklig för att ge ett falskt (0) resultat när du jämför ett lagrat värde med ett konstant värde.

Använd någon av följande metoder för att få korrekta resultat när du jämför tidsvärden. Om du vill testa varje metod skriver du varje metod i direktfönstret och trycker sedan på RETUR:

Lägg till ett datum i tidsjämförelsen:

var1 = #99-01-01 14:01:00 #

var2 = DatumAdd("n", 10, var1)

? var2 = #99-01-01 14:11:00 #

Konvertera tidsvärdena till strängdatatyper innan du jämför dem:

var1 = #14:01:00 #

var2 = DatumAdd("n", 10, var1)

? CStr(var2) = CStr(#2:11:00 PM#)

Använd funktionen DatumDiff() för att jämföra exakta enheter, till exempel sekunder:

var1 = #14:01:00 #

var2 = DatumAdd("n", 10, var1)

? DatumDiff("s", var2, #14:11:00#) = 0

Referenser

Mer information om hur du beräknar datumvärden och tidsvärden finns i Funktionen DatumIntervall

Om du vill ha mer information om hur du formaterar datum-/tidsdatatyper klickar du på Hjälp om Microsoft Access på Hjälp-menyn, anger formategenskap - datatypen datum/tid i Office-assistenten eller i Svarsguiden och klickar sedan på Sök för att visa avsnittet.