Så här lagrar, beräknar och jämför du datum-/tidsdata i Microsoft Access

Sammanfattning

Den här artikeln beskriver hur Microsoft Access lagrar datatypen Datum/tid. Den här artikeln beskriver 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 ett datum/tid-fält
  • Beräkna tidsdata
  • Jämföra datumdata
  • Jämföra tidsdata

Mer information

Lagra datum-/tidsdata

Datatypen Date/Time 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 sträcker sig från -657 434 (1 januari 100 e.d.) till 2 958 465 (31 december 9999 e.d.). Ett datumvärde på 0 representerar den 30 december 1899. Access lagrar datum före den 30 december 1899 som negativa tal.

Giltiga tidsvärden sträcker sig från .0 (00:00:00) till .99999 (23:59:59). Det numeriska värdet representerar en bråkdel 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.

Följande tabell visar hur Access lagrar datum-/tidsvärden:

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

Om du vill visa hur Värden för datum/tid lagras i Access som tal skriver du följande kommandon i fönstret Omedelbart, trycker på RETUR och ser sedan resultatet:

? CDbl(#5/18/1999 14:00:00#)

Resultatet är lika med: 36298.5833333333

? CDbl(#12/14/1849 17:32:00#)

Resultatet är lika med: -18278.7305555556

Om du vill visa datum och tid för numeriska värden skriver du följande kommandon i fönstret Omedelbart, trycker på RETUR och ser sedan resultatet:

? CVDate(1.375)

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

? CVDate(-304398.575)

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

Formatera ett datum/tid-fält

Du kan formatera ett datum/tid-värde för att visa ett datum, en tid eller både och. När du använder ett endast datumformat lagrar Access värdet 0 för tidsdelen. När du använder ett tidsbegränsat format lagrar Access värdet 0 för datumdelen.

Följande tabell visar hur Access lagrar datum-/tidsvärden. I följande tabell visas också hur du kan visa dessa värden med hjälp av olika format:

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

Observera Standardformatet för ett datum/tid-värde är Allmänt datum. Om ett värde är endast datum visas ingen tid. Om värdet är tidsbegränsat visas inget datum.

Beräkna tidsdata

Eftersom ett tidsvärde lagras som en bråkdel av en 24-timmars dag kan du få felaktiga formateringsresultat när du beräknar tidsintervall som är större än 24 timmar. För att kringgå det här beteendet kan du skapa en användardefinierad funktion för att se till att tidsintervallen är korrekt 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. Följ dessa steg för att beräkna och formatera tidsintervall korrekt:

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

    Alternativet är explicit

  2. Skriv 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 fönstret Omedelbart och tryck sedan på RETUR:

    ? ElapsedTime(#6/1/1999 8:23:00PM#-#6/1/1999 8:12:12AM#)

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 siffror med dubbel precision kan du få oväntade resultat när du jämför datum-/tidsdata. Om du till exempel skriver följande uttryck i fönstret Omedelbart får du ett falskt resultat även om dagens datum är 3/31/1999:

? Now()=DateValue("3/31/1999")

Funktionen Now() returnerar ett dubbelprecisionsnummer som representerar aktuellt datum och aktuell tid. Funktionen DateValue() returnerar dock ett heltalsnummer som representerar datumet men inte ett bråktidsvärde. Now() är därför bara lika med DateValue() när Now() returnerar en tid på 00:00:00 (12: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 fönstret Omedelbart, ersätter det aktuella datumet med 3/31/1999 och trycker sedan på RETUR:

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

    ? Date()=DateValue("3/31/1999")

  • Om du vill ta bort deldelen av funktionen Now() använder du funktionen Int():

    ? Int(Now())=DateValue("3/31/1999")

Jämföra tidsdata

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

var1 = #14:01:00#

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

? var2 = #2:11:00 PM#

När Access konverterar ett tidsvärde till ett bråk 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 generera 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 fönstret Omedelbart och trycker sedan på RETUR:

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

var1 = #1/1/99 14:01:00#

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

? var2 = #1/1/99 14:11:00#

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

var1 = #14:01:00#

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

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

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

var1 = #14:01:00#

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

? DateDiff("s", var2, #2:11:00 PM#) = 0

Referenser

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

Om du vill ha mer information om hur du formaterar datatyper för datum/tid klickar du på Microsoft Access-hjälpenhjälpmenyn , skriver formategenskap – datum/tid-datatyp i Office-assistenten eller svarsguiden och klickar sedan på Sök för att visa ämnet.