Adriano il 27/08/2007 scrive:
Ciao Simplex2, ho un problema con Access e spero tanto in un tuo aiuto. Nel database che sto creando, ho in una tabella un campo nel quale sono elencate delle ore. Quello che mi interessa ottenere è la somma di tutte queste ore, volevo sapere la procedura da eseguire per sommare le ore, minuti e secondi, sempre se in access è possibile.
Risposta:
Supponiamo di avere una semplice tabella, chiamata Orari, come la seguente:
ID | Orario |
1 | 12.00 |
2 | 20.31 |
3 | 13.23 |
4 | 11.37 |
Se volessimo estrarre la somma della colonna "Orario" con la funzione di aggregazione di SQL SUM() ci troveremmo di fronte una sorpresa: un numero decimale. Questo numero decimale rappresenta il rapporto tra la effettiva somma delle ore della colonna "Orario" ed il numero 24. La cifra a destra della virgola di questo numero rappresenta i minuti ma NON in sessantesimi ma in decimale.
Nel nosto esempio il risultato sarebbe: 2,3965277778
Quello che dobbiamo fare non è altro che:
- moltiplicare il risultato SUM(Orario) per 24 e considerare la parte intera del risultato, cioè Fix((Sum(Orario) * 24)), per ottenere le ore;
-moltiplicare la parte decimale del risultato SUM(Orario) per 60 per ottenere i minuti, cioè ((Sum(Orario) * 24) - Fix(Sum(Orario) * 24)) * 60.
La seguente query SQL didattica, applicata alla suddetta tabella Orari, illustra meglio tutto il procedimento con i risultati intermedi,
SELECT
Sum(Orario) AS [decimale], Sum(Orario)
* 24 AS [ore e decimali], Fix((Sum(Orario)
* 24)) AS [ore], ((Sum(Orario)
* 24) - Fix(Sum(Orario)
* 24)) * 60 AS [minuti]
FROM Orari;
Il risultato della query è il seguente:
decimale | ore e decimali | ore | minuti |
2,39652777777778 | 57,5166666666667 | 57 | 31,0000000000004 |
Adesso dobbiamo ottenere il risultato vero e proprio ed arrivano le rogne!
Infatti se volessimo ottenere un risultato di tipo Data/Orario (DateTime), dovremmo usare una funzione di access che, date le ore, i minuti ed i secondi, restituisse la somma voluta. Tuttavia in Access il tipo Data/Orario non ammette valori superiori a 24 per le ore. Così se lanciassimo la seguente query:
SELECT TimeValue(TimeSerial(Fix((Sum(Orario)*24)),((Sum(Orario)*24)-Fix(Sum(Orario)*24))*60,0)) FROM Orari;
Otterremmo questo risultato: 9.31.00, che non è proprio ciè che volevamo.
Con un piccolo trucchetto, ovvero rinunciando ad un risultato di tipo Data/Orario per uno di tipo stringa, si può ottenere l'agognata query che effettua la somma degli orari per colonna:
SELECT
Fix((Sum(Orario)*24))
& "." & Fix(((Sum(Orario)*24)-Fix(Sum(Orario)*24))*60)
AS Espr1
FROM Orari;
ed il risultato è il seguente: 57.31
Sono gradite osservazioni e commenti.