Funzione TIME_TO_SEC() e funzione SEC_TO_TIME()
Gli argomenti di questa pagina
|
Calcoli su orari a cavallo della mezzanotte con TIMEDIFF()
Questo lo abbiamo già visto nella pagina precedente, ma lo ripropongo per completare l'argomento.
Viene
eseguita la funzione TIMEDIFF() su orari anzichè su date-ore. In questo caso, se l'orario è nell'arco della giornata il calcolo non da problemi, ma se sta a cavallo della mezzanotte cominciamo ad avere dei problemi, come si può osservare nella colonna "DiffDate".
Primo test: calcola la differenza di tempo degli orari prelevati dalla tabella usando TIMEDIFF()
test 1
|
8 record trovati 8 record visualizzati
|
La funzione TIME_TO_SEC() e la funzione SEC_TO_TIME()
Per risolvere il problema chiediamo aiuto ad altre due funzioni: la funzione TIME_TO_SEC() e la funzione SEC_TO_TIME() che vedremo qui di seguito.
Cominciamo ad eseguire alcune prove usando la funzione TIME_TO_SEC() che dovrebbe restituire l'argomento convertito in secondi.
Nell'esempio qui sotto calcoliamo i secondi su quel che la funzione "TIMEDIFF(esce,entra)" applicata ai due orari ci restituisce.
Nella colonna DiffDate infatti abbiamo i secondi del risultato che ci ha restituito la funzione TIMEDIFF()).
Anche se il risultato non è soddisfaciente per via dei numeri negativi della colonna DiffDate, possiamo dire di cominciare a capire qualcosa. Questi numeri negativi sono dovuti dal fatto che gli orari calcolati sono a cavallo della mezzanotte.
Secondo test: calcola la differenza di tempo in secondi degli orari prelevati dalla tabella usando TIME_TO_SEC()
test 2
|
8 record trovati 8 record visualizzati
|
Verificare se l'orario è a cavallo della mezzanotte
Perciò proviamo a mettere una IF nella QUERY.
Se "entra" è minore di "esce"
siamo nella giornata quindi
possiamo eseguire direttamente il calcolo
altrimenti
siamo a cavallo della mezzanotte perciò eseguiamo il calcolo ma dobbiamo aggiungere 86400 che sono i secondi di una giornata che si ottengono con 24*60*60
if(entra<=esce,
se vero => azione 1,
se falso => azione 2
)
e cioè:
if(entra<=esce,
TIME_TO_SEC(TIMEDIFF(esce,entra)),
TIME_TO_SEC(TIMEDIFF(esce,entra))+86400
)
Terzo test: calcola la differenza di tempo degli orari ma verifica gli orari
Ora sembra che andiamo meglio. Tutti i valori ottenuti nella colonna "secondi" sono positivi.
test 3
|
8 record trovati 8 record visualizzati
|
Ora dobbiamo convertire i secondi ottenuti in formato orario.
Per fare questa conversione possiamo invocare la funzione SEC_TO_TIME() che converte i secondi in HH:MM:SS.
In questo esempio mostro sia la colonna secondi, appena vista nella tabella qui sopra, che la colonna test che ospita gli orari calcolati, compresi quelli a cavallo della mezzanotte.
test risolutivo
|
8 record trovati 8 record visualizzati
|
La soluzione finale per calcoli su orari
Ora finalmente siamo pronti per l'ultimo passo definitivo che mostra solo il recordset desiderato e cioè il nome dell'operatore, l'ora di ingresso, l'ora di uscita e l'orario effettuato.
Query finale: calcola gli orari effettuati tenendo conto anche degli orari a cavallo della mezzanotte
esempio finale
|
8 record trovati 8 record visualizzati
|