Help and Support

Identificativo articolo: 210276 - Ultima modifica: venerdì 23 marzo 2007 - Revisione: 6.3

Archiviazione, calcolo e confronto di dati Data/ora in Microsoft Access

Per la versione di questo articolo relativa a Microsoft Access 97, vedere 130514  (http://support.microsoft.com/kb/130514/ ) .
Difficoltà media: sono richieste conoscenze di base di creazione di macro, gestione di codice e di interoperabilità.

In questa pagina

Espandi tutto | Chiudi tutto

Sommario

In questo articolo viene descritto come vengono archiviati i dati di tipo Data/ora in Microsoft Access. In questo articolo viene inoltre descritto perché può accadere di ottenere risultati imprevisti quando si calcolano o si confrontano date e ore.

Verranno illustrati i seguenti argomenti:
  • Archiviazione di dati Data/ora
  • Formattazione di un campo Data/ora
  • Calcolo di dati ora
  • Confronto di dati data
  • Confronto di dati ora

Informazioni

Archiviazione di dati Data/ora

In Access il tipo di dati Data/ora viene archiviato come numero a precisione doppia e a virgola mobile fino a 15 posizioni decimali. La parte dell'intero del numero a precisione doppia rappresenta la data. La parte decimale rappresenta l'ora.

I valori validi per la data vanno da -657,434 (1° gennaio 100 d.C.) a 2,958,465 (31 dicembre 9999 d.C.). Il valore di data 0 rappresenta il 30 dicembre 1899. Access memorizza le date precedenti al 30 dicembre 1899 come numeri negativi.

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

Nella tabella seguente viene mostrato come Access memorizza i valori Data/ora:
   Numero         Porzione  Data              Porzione  Ora
   doppio         di data   effettiva         di ora    effettiva
   --------------------------------------------------------------

        1.0           1     31 dicembre 1899  .0        00.00.00
        2.5           2     1° gennaio 1900   .5        00.00.00
    27468.96875   27468     15 marzo 1975     .96875    23.15.00
    36836.125     36836     6 novembre 2000   .125      03.00.00
Per visualizzare come Access memorizza i valori Data/ora sotto forma di numeri, digitare i seguenti comandi nella finestra Immediata, premere INVIO, quindi osservare i risultati:
?CDbl(#5/18/1999 14:00:00#)
Il risultato equivale a: 36298.5833333333
?CDbl(#12/14/1849 17:32:00#)
Il risultato equivale a: -18278.7305555556

Per visualizzare la data e l'ora dei valori numerici, digitare i seguenti comandi nella finestra Immediata, premere INVIO, quindi osservare i risultati:
?CVDate(1.375)
Il risultato equivale a: 31/12/1899 09.00.00
?CVDate(-304398.575)
Il risultato equivale a: 1/8/1066 13.48.00

Formattazione di un campo Data/ora

È possibile formattare un valore Data/ora per visualizzare una data, un'ora o entrambe. Quando si utilizza un formato solo data, viene archiviato il valore 0 per la porzione relativa all'ora. Quando si utilizza un formato solo ora, viene archiviato il valore 0 per la porzione relativa alla data.

Nella tabella seguente viene mostrato in che modo i valori Data/ora vengono archiviati in Access. Viene inoltre mostrato come è possibile visualizzare tali valori utilizzando formati diversi:
   Valore archiviato       Formato predefinito    Formato personalizzato
   (numero doppio)         (Data generica)        (gg/mm/aaaa hh.mm.ss)
   ---------------------------------------------------------------------

   36295.0                 15/05/99               15/05/1999 00.00.00
       0.546527777777778   13.07                  30/12/1899 13.07.00
   36232.9375              13/03/99 22.30         13/03/1999 22.30.00
Nota Il formato predefinito per un valore Data/ora è Data generica. Se un valore è del tipo solo data, non viene visualizzata l'ora. Se il valore è del tipo solo ora, non viene visualizzata la data.

Calcolo di dati ora

Poiché un valore orario è archiviato come frazione di un giorno di 24 ore, è possibile che si ottengano risultati di formattazione non corretti quando si calcolano intervalli di tempo maggiori di 24 ore. Per aggirare il problema, è possibile creare una funzione definita dall'utente con cui garantire 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 presume che l'utente conosca il linguaggio di programmazione in questione e gli strumenti utilizzati per creare ed eseguire il debug delle routine. Gli esperti Microsoft sono autorizzati a fornire spiegazioni in merito alla funzionalità di una determinata routine, ma in nessun caso a modificare questi esempi per fornire funzionalità aggiuntive o a creare routine atte a soddisfare specifiche esigenze. Per calcolare e formattare correttamente gli intervalli di tempo, attenersi alla procedura seguente:
  1. Creare una maschera e digitare la seguente riga nella sezione Dichiarazioni se non è già presente:
    Option Explicit
    					
  2. Digitare la seguente routine:
    '------------------------------------------------------------------
    '  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. Nella finestra Immediata digitare la seguente riga e premere INVIO:
    ? ElapsedTime(#6/1/1999 8:23:00PM#-#6/1/1999 8:12:12AM#)
    Vengono visualizzati i seguenti valori:
    43848 secondi
    730.48 minuti.secondi
    12.10.48 ore.minuti.secondi
    0 giorni 12 ore 10 minuti 48 secondi

Confronto di dati data

Poiché le date e le ore vengono archiviate insieme come numeri a precisione doppia, è possibile ottenere risultati imprevisti quando si esegue il confronto di date e ore. Se ad esempio si digita la seguente espressione nella finestra Immediata, si ottiene un risultato errato anche se la data odierna è 31/03/1999:
? Now()=DateValue("3/31/1999")
La funzione Now() restituisce un numero a precisione doppia che rappresenta la data e l'ora correnti. Tuttavia, la funzione DateValue() restituisce un numero intero che rappresenta la data ma non un valore orario frazionario. Pertanto, Now() equivale a DateValue() solo quando Now() restituisce l'ora 00.00.00.

Per ottenere risultati accurati quando si confrontano i valori di data, utilizzare una delle funzioni seguenti. Per provare ciascuna funzione, digitarla nella finestra Immediata, sostituire 3/31/1999 con la data corrente e premere INVIO:
  • Per restituire un valore intero, utilizzare la funzione Date():
    ?Date()=DateValue("3/31/1999")
  • Per rimuovere la parte frazionaria della funzione Now(), utilizzare la funzione Int():
    ?Int(Now())=DateValue("3/31/1999")

Confronto di dati ora

Quando si confrontano valori orari, è possibile che si ottengano risultati incoerenti perché un valore orario è archiviato come parte frazionaria di un numero a precisione doppia e con virgola mobile. Se ad esempio si digita la seguente espressione nella finestra Immediata, si ottiene un risultato errato (0) anche se i due valori orari sono gli stessi:
var1 = #2:01:00 PM#
var2 = DateAdd("n", 10, var1)
? var2 = #2:11:00 PM#
Quando Access converte un valore orario in una frazione, il risultato calcolato potrebbe non essere identico al valore orario. La lieve differenza dovuta al calcolo è sufficiente a produrre un risultato errato (0) quando si confronta un valore archiviato con una valore costante.

Per ottenere risultati accurati quando si confrontano valori orari, utilizzare uno dei metodi seguenti. Per provare ciascun metodo, digitarlo nella finestra Immediata, quindi premere INVIO:

Aggiunta di una data associata al confronto orario:
var1 = #1/1/99 2:01:00 PM#
var2 = DateAdd("n", 10, var1)
? var2 = #1/1/99 2:11:00 PM#
Conversione dei valori orari 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#)
Uso della funzione DateDiff() per confrontare unità precise quali i secondi:
var1 = #2:01:00 PM#
var2 = DateAdd("n", 10, var1)
? DateDiff("s", var2, #2:11:00 PM#) = 0

Riferimenti

Per ulteriori informazioni sul calcolo dei valori data e ora, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito:
210604  (http://support.microsoft.com/kb/210604/ ) Funzioni per il calcolo e la visualizzazione di valori Data/ora in Access
Per ulteriori informazioni su come formattare i tipi di dati Data/ora, scegliere Guida in linea Microsoft Access dal menu ?, digitare proprietà formattazione - tipo di dati Data/ora nell'Assistente di Office o nella Ricerca libera e scegliere il pulsante Cerca per visualizzare l'argomento.

Le informazioni in questo articolo si applicano a:
  • Microsoft Office Access 2007
  • Microsoft Office Access 2003
  • Microsoft Access 2002 Standard Edition
  • Microsoft Access 2000 Standard Edition
Chiavi: 
kbdatetime kbfunctions kbinfo kbfaq kbhowto kbprogramming KB210276
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Traduzione articoli