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: