Come archiviare, calcolare e confrontare i dati di data/ora in Microsoft Access

Riepilogo

Questo articolo descrive in che modo Microsoft Access archivia il tipo di dati Data/ora. Questo articolo descrive anche il motivo per cui è possibile ricevere risultati imprevisti quando si calcolano date e ore o si confrontano date e ore.

Questo articolo descrive gli argomenti seguenti:

  • Archiviare dati di data/ora
  • Formattare un campo Data/ora
  • Calcolare i dati relativi all'ora
  • Confrontare i dati relativi alla data
  • Confrontare i dati relativi all'ora

Ulteriori informazioni

Archiviare dati di data/ora

Access archivia il tipo di dati Data/ora come numero a virgola mobile a precisione doppia fino a 15 posizioni decimali. La parte intera del numero a precisione doppia rappresenta la data. La parte decimale rappresenta l'ora.

I valori di data validi sono compresi tra -657.434 (1 gennaio 100 d.C.) e 2.958.465 (31 dicembre 9999 d.C.). Un valore per la data uguale a 0 rappresenta il 30 dicembre 1899. Access archivia le date precedenti al 30 dicembre 1899 come numeri negativi.

I valori validi per l'ora sono compresi tra 0,0 (00.00.00) e 0,99999 (23.59.59). Il valore numerico rappresenta una frazione di un giorno. È possibile convertire il valore numerico in ore, in minuti e in secondi moltiplicando il valore numerico per 24.

Nella tabella seguente viene illustrato come In Access vengono archiviati i valori di data/ora:

Numero doppio Parte data Data effettiva Parte relativa all'ora Tempo effettivo
1.0 1 31 dicembre 1899 .0 Ore 12:00:00
2.5 2 1 gennaio 1900 0,5 12:00:00 p.m.
27468.96875 27468 15 marzo 1975 .96875 23:15:00
36836.125 36836 6 novembre 2000 .125 Ore 3:00:00

Per visualizzare il modo in cui i valori di data/ora vengono archiviati come numeri, digitare i comandi seguenti nella finestra Immediata, premere INVIO e quindi notare i risultati:

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

Risultato uguale a: 36298.58333333333

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

Risultato uguale a: -18278.730555556

Per visualizzare la data e l'ora dei valori numerici, digitare i comandi seguenti nella finestra Immediata, premere INVIO e quindi notare i risultati:

? CVDate(1.375)

Risultato uguale a: 31/12/1899 9:00:00

? CVDate(-304398.575)

Risultato uguale a: 1/8/1066 13:48:00

Formattare un campo Data/ora

È possibile formattare un valore di data/ora per visualizzare una data, un'ora o entrambi. Quando si usa un formato di sola data, access archivia un valore pari a 0 per la parte relativa all'ora. Quando si usa un formato di sola ora, Access archivia un valore pari a 0 per la parte relativa alla data.

Nella tabella seguente viene illustrato come In Access vengono archiviati i valori di data/ora. Nella tabella seguente viene inoltre illustrato come visualizzare tali valori usando formati diversi:

Valore archiviato (numero doppio) Formato predefinito (data generale) Formato personalizzato (mm/dd/aaaa hh:nn:ss A.M./P.M.)
36295.0 5/15/99 15/05/1999 12:00:00
0.546527777777778 13:07 30/12/1899 13:07:00
36232.9375 3/13/99 22:30 13/03/1999 22:30:00

Nota Il formato predefinito per un valore di data/ora è Data generale. Se un valore è di sola data, non viene visualizzata alcuna ora. Se il valore è di sola ora, non viene visualizzata alcuna data.

Calcolare i dati relativi all'ora

Poiché il valore relativo all'ora viene memorizzato come frazione di un giorno di 24 ore, è possibile che vengano visualizzati risultati con formati non corretti quando si calcolano intervalli dei valori di ora maggiori di 24 ore. Per risolvere questo comportamento, è possibile creare una funzione definita dall'utente per assicurarsi che gli intervalli di tempo siano formattati correttamente.

Microsoft fornisce esempi di programmazione a scopo puramente illustrativo, senza alcuna garanzia di qualsiasi tipo, sia espressa che implicita, ivi incluse, senza limitazioni, le garanzie implicite di commerciabilità o idoneità per uno scopo particolare. In questo articolo si presuppone che l'utente conosca il linguaggio di programmazione in questione e gli strumenti utilizzati per creare ed eseguire il debug delle procedure. Gli esperti Microsoft sono autorizzati a fornire spiegazioni in merito alla funzionalità di una particolare routine, ma in nessun caso a modificare questi esempi per fornire funzionalità aggiuntive o a creare routine atte a soddisfare specifiche esigenze. Per calcolare correttamente e formattare gli intervalli di tempo, seguire questa procedura:

  1. Creare un modulo e quindi digitare la riga seguente nella sezione Dichiarazioni se la riga seguente non è già presente:

    Opzione esplicita

  2. Digitare la procedura seguente:

    '------------------------------------------------------------------
    '  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. Digitare la riga seguente nella finestra Immediata e quindi premere INVIO:

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

Si noti che vengono visualizzati i valori seguenti:

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

Confrontare i dati relativi alla data

Poiché i valori di data e ora vengono memorizzati insieme come numeri a precisione doppia, è possibile ricevere risultati imprevisti quando si confrontano dati Data/ora. Ad esempio, se si digita l'espressione seguente nella finestra Immediata, si riceve un risultato False anche se la data odierna è il 31/3/03/1999:

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

La funzione Now() restituisce un numero a precisione doppia che rappresenta la data corrente e l'ora corrente. Tuttavia, la funzione DateValue() restituisce un numero intero che rappresenta la data ma non un valore di ora frazionaria. Now() è quindi uguale a DateValue() solo quando Now() restituisce un'ora pari a 00:00:00 (12:00:00 a.M.).

Per ricevere risultati precisi quando si confrontano i valori di data, utilizzare una delle funzioni seguenti. Per testare ogni funzione, digitare la funzione nella finestra Immediata, sostituire la data corrente con il 31/31/1999 e quindi premere INVIO:

  • Per restituire un valore intero, usare la funzione Date():

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

  • Per rimuovere la parte frazionaria della funzione Now(), usare la funzione Int():

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

Confrontare i dati relativi all'ora

Quando si confrontano i valori di ora, è possibile che vengano visualizzati risultati incoerenti perché un valore di ora viene archiviato come parte frazionaria di un numero a virgola mobile a precisione doppia. Ad esempio, se si digita l'espressione seguente nella finestra Immediata, si riceve un risultato false (0) anche se i due valori di ora hanno lo stesso aspetto:

var1 = #2:01:00 PM#

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

? var2 = #2:11:00 PM#

Quando Access converte un valore di tempo in una frazione, il risultato calcolato potrebbe non essere identico al valore di ora. La piccola differenza causata dal calcolo è sufficiente per produrre un risultato false (0) quando si confronta un valore archiviato con un valore costante.

Per ricevere risultati precisi quando si confrontano i valori di ora, utilizzare uno dei metodi seguenti. Per testare ogni metodo, digitare ogni metodo nella finestra Immediata e quindi premere INVIO:

Aggiungere una data associata al confronto dei valori di ora:

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

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

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

Convertire i valori di ora in tipi di dati stringa prima di confrontarli:

var1 = #2:01:00 PM#

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

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

Usare la funzione DateDiff() per confrontare unità precise, ad esempio secondi:

var1 = #2:01:00 PM#

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

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

Riferimenti

Per altre informazioni sul calcolo dei valori di data e ora, vedere Funzione DateSerial

Per altre informazioni su come formattare i tipi di dati data/ora, fare clic su Guida di Microsoft Access nel menu ? , digitare proprietà formato - tipo di dati data/ora nell'Assistente di Office o nella Ricerca guidata e quindi fare clic su Cerca per visualizzare l'argomento.