Access & C.

Somma di orari su colonne con una Query SQL di Access

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.

Inserisci un commento   |   Indietro

[1] Nick Name: Simplex2     Data: 15/09/2010 12:19:40    www.mdenittis.it   
Vedi anche:

  [da 1 a 1 di 1 commenti]     |   Indietro

Inserisci un commento

Nick: e-mail:

web:

Commento: