Identificativo articolo: 210604 - Ultima modifica: giovedì 12 ottobre 2006 - Revisione: 4.3

Funzioni per il calcolo e la visualizzazione di valori Data/ora in Access

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

Dato che un valore Data/ora è memorizzato sotto forma di numero a precisione doppia, può accadere che si ottengano risultati formattati in modo errato quando si tenta di manipolare dati Data/ora in un'espressione. In questo articolo viene descritto come creare espressioni e funzioni personalizzate per visualizzare date specifiche e per calcolare gli intervalli di tempo.

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 procedura, ma in nessun caso a modificare questi esempi per fornire funzionalità aggiuntive o a creare procedure atte a soddisfare specifiche esigenze.

Informazioni

Visualizzazione di date specifiche

Per visualizzare date specifiche, è possibile utilizzare la funzione DateSerial() con cui manipolare le parti di una data relative al giorno, al mese e all'anno. Ad esempio, è possibile utilizzare le espressioni seguenti nella proprietà ControlSource di una casella di testo o nella finestra Immediata per restituire date specifiche:
  • Il mese corrente:
    DateSerial(Year(Date()), Month(Date()), 1)
  • Il mese successivo:
    DateSerial(Year(Date()), Month(Date()) + 1, 1)
  • L'ultimo giorno del mese corrente:
    DateSerial(Year(Date()), Month(Date()) + 1, 0)
  • L'ultimo giorno del mese successivo:
    DateSerial(Year(Date()), Month(Date()) + 2, 0)
  • Il primo giorno del mese precedente:
    DateSerial(Year(Date()), Month(Date())-1,1)
  • L'ultimo giorno del mese precedente:
    DateSerial(Year(Date()), Month(Date()),0)
  • Il primo giorno del trimestre corrente:
    DateSerial(Year(Date()), Int((Month(Date()) - 1) / 3) * 3 + 1, 1)
  • L'ultimo giorno del trimestre corrente:
    DateSerial(Year(Date()), Int((Month(Date()) - 1) / 3) * 3 + 4, 0)
  • Il primo giorno della settimana corrente (domenica = giorno 1):
    Date() - WeekDay(Date()) + 1
  • L'ultimo giorno della settimana corrente:
    Date() - WeekDay(Date()) + 7
  • Il primo giorno della settimana corrente (utilizzando le impostazioni della finestra di dialogo Opzioni):
    Date() - WeekDay(Date(), 0) + 1
  • L'ultimo giorno della settimana corrente:
    Date() - WeekDay(Date(), 0) + 7
Per ulteriori informazioni sul calcolo dell'anno fiscale o del mese fiscale, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito:
210249  (http://support.microsoft.com/kb/210249/ ) Visualizzazione dell'anno o del mese fiscale di una data particolare in Access 2000
ATTENZIONE: la procedura riportata in questo esempio comporta la modifica del database Northwind.mdb. È consigliabile fare una copia di backup del file Northwind.mdb sulla quale eseguire la procedura.

Calcolo degli intervalli di tempo

Poiché un valore orario è memorizzato come frazione di un giorno di 24 ore, è possibile che si ottengano risultati formattati non correttamente quando si cerca di aggiungere, sottrarre, moltiplicare o dividere dati orari maggiori di 24 ore.

Se ad esempio si cerca di trovare il numero di ore trascorse tra due date sottraendo i valori in Visual Basic, è possibile che si ottenga un numero errato. A dimostrazione di ciò, digitare il codice seguente nella finestra Immediata e notare come viene restituito il valore 05.00 ore piuttosto che il valore corretto 53.00 ore:
   StartDate=#6/1/93 8:00AM#
   EndDate=#6/3/93 1:00PM#
   ?Format(EndDate-StartDate,"hh:mm")

Per risolvere i problemi causati dai valori orari maggiori di 24 ore, è possibile utilizzare le funzioni Int() e CSng() in Visual Basic per separare un valore orario calcolato in variabili diverse per i giorni, le ore, i minuti e i secondi. Ad esempio, è possibile includere il seguente frammento di codice in una funzione personalizzata per creare variabili di tempo distinte:
 '-------------------------------------------------------------------
 ' This sample code separates a time interval into seven variables for
 ' the following values: days, hours, minutes, seconds, total time in
 ' hours, total time in minutes, and total time in seconds.
 '
 ' The interval argument is flexible; it can be a single value, an
 ' expression, or a field reference.
 '-------------------------------------------------------------------

 Dim totalhours As Long, totalminutes As Long, totalseconds As Long
 Dim days As Long, hours As Long, minutes As Long, seconds As Long
 Dim interval As Variant

 days = Int(CSng(interval))
 totalhours = Int(CSng(interval * 24))
 totalminutes = Int(CSng(interval * 1440))
 totalseconds = Int(CSng(interval * 86400))
 hours = totalhours Mod 24
 minutes = totalminutes Mod 60
 seconds = totalseconds Mod 60

È possibile utilizzare le variabili totalhours, totalminutes e totalseconds per visualizzare un valore orario come singola unità di tempo. Le variabili dei giorni, delle ore, dei minuti e dei secondi consentono di suddividere un valore orario in porzioni di tempo. Per visualizzare i valori orari in formati diversi, è possibile concatenare le variabili come mostrato nelle seguenti funzioni di esempio:
  • La funzione GetElapsedDays() consente di calcolare il tempo trascorso tra due valori Data/ora e visualizzarne il risultato in giorni.
  • La funzione GetElapsedTime() consente di calcolare il tempo trascorso tra due valori orari e visualizzarne il risultato in giorni, ore, minuti e secondi.
  • La funzione GetTimeCardTotal() consente di sommare un campo di valori orari di una tabella e di visualizzarne il totale in ore e minuti.

Funzione di esempio GetElapsedDays()

Per creare la funzione GetElapsedDays(), attenersi alla seguente procedura:
  1. Aprire il database di esempio Northwind.mdb.
  2. Creare un modulo e digitare la seguente riga nella sezione Dichiarazioni se non è già presente:
     Option Explicit
  3. Digitare la funzione seguente:
     Function GetElapsedDays (interval)
        Dim days As Long
    
        days = Int(CSng(interval))
        GetElapsedDays = days & " Days "
     End Function
  4. Per provare questa funzione, creare una nuova query basata sulla tabella Ordini.
  5. Nella griglia QBE aggiungere i seguenti campi.
        Campo: DataSpedizione
        Mostra: Vero
    
        Campo: DataOrdine
        Mostra: Vero
    
        Campo: ElapsedTime: GetElapsedDays([DataSpedizione]-[DataOrdine])
        Mostra: Vero
  6. Eseguire la query. Notare che nella colonna ElapsedTime viene visualizzato il numero di giorni compresi tra il valore del campo DataSpedizione e il valore del campo DataOrdine relativi a ciascun record della tabella Ordini.

Funzione di esempio GetElapsedTime()

Per creare la funzione GetElapsedTime(), attenersi alla seguente procedura:
  1. Creare una nuova tabella con la seguente struttura, quindi salvarla con il nome TimeLog.
        Tabella: TimeLog
        ----------------------
        Nome campo: StartTime
        Tipo dati: Data/ora
        Formato: Data generica
    
        Nome campo: EndTime
        Tipo dati: Data/ora
        Formato: Data generica
  2. Aprire la tabella TimeLog in visualizzazione Foglio dati, immettere i seguenti tre record, quindi chiudere la tabella:
        StartTime               EndTime
        -----------------------------------------
        10/05/95 16.57.00       15/05/95 02.38.00
        11/05/95 10.17.31       24/05/95 18.05.00
        18/05/95 09.16.43       19/05/95 17.03.00
  3. Creare un modulo e digitare quanto segue nella sezione Dichiarazioni:
     Option Explicit
  4. Immettere la funzione seguente:
     Function GetElapsedTime(interval)
    
     Dim totalhours As Long, totalminutes As Long, totalseconds As _
         Long
     Dim days As Long, hours As Long, Minutes As Long, Seconds As Long
    
     days = Int(CSng(interval))
     totalhours = Int(CSng(interval * 24))
     totalminutes = Int(CSng(interval * 1440))
     totalseconds = Int(CSng(interval * 86400))
     hours = totalhours Mod 24
     Minutes = totalminutes Mod 60
     Seconds = totalseconds Mod 60
    
     GetElapsedTime = days & " Days " & hours & " Hours " & Minutes & _
     " Minutes " & Seconds & " Seconds "
    
     End Function

    NOTA: la funzione GetElapsedTime necessita che le vengano passate una data e un'ora.
  5. Per provare questa funzione, creare un nuovo report basato sulla tabella TimeLog utilizzando la Creazione guidata Report standard.
  6. Visualizzare il report in Visualizzazione Struttura.
  7. Aggiungere alla sezione dei dettagli della tabella TimeLog una casella di testo non associata e impostarne le proprietà nel modo seguente:
        Casella di testo
        ----------------
        Nome: ElapsedTime
        ControlSource: =GetElapsedTime([EndTime]-[StartTime])
        Larghezza: 3 pollici
  8. Visualizzare il report in anteprima. Notare che in ogni record viene visualizzato il tempo totale trascorso in giorni, ore, minuti e secondi.

Funzione di esempio GetTimeCardTotal()

Per creare la funzione GetTimeCardTotal(), attenersi alla seguente procedura:

NOTA: per il codice di esempio riportato in questo articolo viene utilizzato Microsoft Data Access Objects. Affinché il codice funzioni correttamente è necessario fare riferimento alla libreria oggetti di Microsoft DAO 3.6. A questo scopo, scegliere Riferimenti dal menu Strumenti in Visual Basic Editor e assicurarsi che la casella di controllo Libreria oggetti Microsoft DAO 3.6 sia selezionata.

  1. Creare una nuova tabella con la seguente struttura, quindi salvarla con il nome TimeCard.
        Tabella: TimeCard
        -----------------------
        Nome campo: Daily Hours
        Tipo dati: Data/ora
        Formato: Ora breve 24h
  2. Visualizzare la tabella TimeCard in visualizzazione Foglio dati, immettere i seguenti quattro record, quindi chiudere la tabella:
        8.15
        7.37
        8.12
        8.03
  3. Creare un modulo e digitare la seguente riga nella sezione Dichiarazioni se non è già presente:
      Option Explicit
  4. Digitare la funzione seguente:
      
     Function GetTimeCardTotal ()   
    
     Dim db As DAO.Database, rs As DAO.Recordset  
     Dim totalhours As Long, totalminutes As Long
     Dim days As Long, hours As Long, minutes As Long
     Dim interval As Variant, j As Integer  
    
     Set db = dbengine.workspaces(0).databases(0) 
     Set rs = db.OpenRecordset("timecard") 
     interval = #12:00:00 AM# 
        While Not rs.EOF 
           interval = interval + rs![Daily hours] 
           rs.MoveNext 
        Wend 
     totalhours = Int(CSng(interval * 24)) 
     totalminutes = Int(CSng(interval * 1440)) 
     hours = totalhours Mod 24 
     minutes = totalminutes Mod 60 
    
     GetTimeCardTotal = totalhours & " hours and " & minutes & " minutes" 
    
     End Function
  5. Per provare questa funzione, digitare la seguente riga nella finestra Immediata, quindi premere INVIO:
     ?GetTimeCardTotal()

    Notare che nella finestra Immediata viene visualizzato 32 ore e 7 minuti.

Riferimenti

Per ulteriori informazioni sul calcolo dei valori Data/ora, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito:
210276  (http://support.microsoft.com/kb/210276/ ) Memorizzazione, calcolo e confronto di dati Data/ora in Microsoft Access

Le informazioni in questo articolo si applicano a:
  • Microsoft Office Access 2003
  • Microsoft Access 2002 Standard Edition
  • Microsoft Access 2000 Standard Edition
Chiavi: 
kbhowto kbprogramming KB210604
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

 

Related Support Centers