Funzione TIME_TO_SEC() e funzione SEC_TO_TIME()

Gli argomenti di questa pagina

  • Calcoli su orari a cavallo della mezzanotte con TIMEDIFF()
  • La funzione TIME_TO_SEC() e la funzione SEC_TO_TIME()
  • Verificare se l'orario è a cavallo della mezzanotte
  • La soluzione finale per calcoli su orari

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
1
2
3
4
5
6
<?php
$Query 
"SELECT nome, entra, esce, 
TIMEDIFF( esce, entra ) AS DiffDate
FROM sql_ore_lavorative
"
;
?>
8 record trovati
8 record visualizzati
nome entra esce DiffDate
Migliavacca Luigi 10:00:00 15:00:00 05:00:00
Rizzi Carlo 08:00:00 14:00:00 06:00:00
Liberali Franca 22:40:00 08:00:00 -14:40:00
Di Maggio Mario 13:59:00 22:30:00 08:31:00
Scicchitano Andrea 07:05:00 14:15:00 07:10:00
Edelvisi Maurizio 13:58:00 21:05:00 07:07:00
Gerardini Silvano 20:58:00 07:05:00 -13:53:00
Pasotti Alessio 06:43:00 14:11:00 07:28:00

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
1
2
3
4
5
6
 <?php
$Query 
"SELECT entra, esce, 
TIME_TO_SEC(TIMEDIFF(esce,entra)) AS DiffDate 
FROM sql_ore_lavorative
"
;
?> 
8 record trovati
8 record visualizzati
entra esce DiffDate
10:00:00 15:00:00 18000
08:00:00 14:00:00 21600
22:40:00 08:00:00 -52800
13:59:00 22:30:00 30660
07:05:00 14:15:00 25800
13:58:00 21:05:00 25620
20:58:00 07:05:00 -49980
06:43:00 14:11:00 26880

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

La IF, per essere accettata dalla Query è costruita in questa maniera:

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
1
2
3
4
5
6
7
8
<?php
$Query 
"SELECT entra, esce, 
if(entra<=esce,
TIME_TO_SEC(TIMEDIFF(esce,entra)),
TIME_TO_SEC(TIMEDIFF(esce,entra))+86400) AS secondi 
FROM sql_ore_lavorative
"
;
?>
8 record trovati
8 record visualizzati
entra esce secondi
10:00:00 15:00:00 18000
08:00:00 14:00:00 21600
22:40:00 08:00:00 33600
13:59:00 22:30:00 30660
07:05:00 14:15:00 25800
13:58:00 21:05:00 25620
20:58:00 07:05:00 36420
06:43:00 14:11:00 26880

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
1
2
3
4
5
6
7
8
9
10
11
<?php
$Query 
"SELECT entra, esce, 
if(entra<=esce,
TIME_TO_SEC(TIMEDIFF(esce,entra)),
TIME_TO_SEC(TIMEDIFF(esce,entra))+86400) AS secondi, 
if(entra<=esce,
SEC_TO_TIME(TIME_TO_SEC(TIMEDIFF(esce,entra))),
SEC_TO_TIME(TIME_TO_SEC(TIMEDIFF(esce,entra))+86400)) AS test 
FROM sql_ore_lavorative
"

?>
8 record trovati
8 record visualizzati
entra esce secondi test
10:00:00 15:00:00 18000 05:00:00
08:00:00 14:00:00 21600 06:00:00
22:40:00 08:00:00 33600 09:20:00
13:59:00 22:30:00 30660 08:31:00
07:05:00 14:15:00 25800 07:10:00
13:58:00 21:05:00 25620 07:07:00
20:58:00 07:05:00 36420 10:07:00
06:43:00 14:11:00 26880 07:28:00

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
1
2
3
4
5
6
7
8
<?php
$Query 
"SELECT nome, entra, esce, 
if(entra<=esce,
SEC_TO_TIME(TIME_TO_SEC(TIMEDIFF(esce,entra))),
SEC_TO_TIME(TIME_TO_SEC(TIMEDIFF(esce,entra))+86400)) AS orario
FROM sql_ore_lavorative
"
;
?>
8 record trovati
8 record visualizzati
nome entra esce orario
Migliavacca Luigi 10:00:00 15:00:00 05:00:00
Rizzi Carlo 08:00:00 14:00:00 06:00:00
Liberali Franca 22:40:00 08:00:00 09:20:00
Di Maggio Mario 13:59:00 22:30:00 08:31:00
Scicchitano Andrea 07:05:00 14:15:00 07:10:00
Edelvisi Maurizio 13:58:00 21:05:00 07:07:00
Gerardini Silvano 20:58:00 07:05:00 10:07:00
Pasotti Alessio 06:43:00 14:11:00 07:28:00

 

 



settore tecnico il sito di lorettabweb il Forum di sostegno
il forum il forum il forum