Funzione DATEDIFF(), TIMEDIFF() e TIMESTAMPDIFF()

Gli argomenti di questa pagina

  • La funzione DATEDIFF()
  • La funzione TIMESTAMPDIFF() per calcolare gli anni
  • La funzione TIMESTAMPDIFF() per calcolare gli anni, i mesi o i giorni
  • La funzione TIMEDIFF()
  • Calcoli su orari a cavallo della mezzanotte con TIMEDIFF()

Definizione e sintassi della funzione DATEDIFF() e TIMEDIFF().

La funzione DATEDIFF() restituisce il tempo trascorso tra due date.
La funzione TIMEDIFF() restituisce le differenze tra due espressioni di tempo o datetime. Le due espressioni devono essere dello stesso tipo (DATE, DATETIME, TIMESTAMP, TIME).
Questa la sintassi

DATEDIFF(endDate, startDate)
TIMEDIFF( endDate , startDate )

La funzione DATEDIFF()

Calcolare la differenza di tempo trascorso tra la data letta nel DB e la data corrente restituita in giorni trascorsi.

esempio 1
1
2
3
4
5
6
7
<?php
$Query 
"SELECT cognome, nome, 
DATE_FORMAT( data_nascita, '%d-%m-%Y' ) AS nato, 
DATEDIFF(NOW(),data_nascita) AS DiffDate
FROM sql_rubrica
"
;
?>
101 record trovati
15 record visualizzati
cognome nome nato DiffDate
Migliavacca Luigi 22-01-2004 6738
Rizzi Carlo 22-11-2007 5338
Liberali Franca 20-02-2004 6709
Di Maggio Mario 21-05-2009 4792
Scicchitano Andrea 12-01-1997 9304
Edelvisi Maurizio 02-07-1987 12786
Gerardini Silvano 12-08-2009 4709
Pasotti Alessio 14-11-1987 12651
Calvi Giovanni 26-07-1987 12762
Poggi Giuseppe 25-01-1987 12944
Curti Oreste 26-06-1988 12426
Borsotti Mirella 19-07-1987 12769
Franchinotti Anna 10-05-2009 4803
Pischedda Giovanni 08-08-1999 8366
Maini Marilena 20-03-2002 7411
... ... ... ...

In questo secondo esempio viene calcolata la differenza di tempo trascorso tra tra due date vicine tra loro (si tratta di orari lavorativi, quindi l'intervallo è brevissimo).
In questo caso la massima differenza è '1' e solo se gli orari sono a cavallo della mezzanotte.

Calcola la differenza di tempo trascorso tra due date lette nel DB

esempio 2
1
2
3
4
5
6
7
8
<?php
$Query 
"SELECT nome, 
DATE_FORMAT( data_start, '%d-%m-%Y %k:%i:%s' ) AS start, 
DATE_FORMAT( data_end, '%d-%m-%Y %k:%i:%s' ) AS end, 
DATEDIFF( data_end , data_start ) AS DiffDate
FROM sql_ore_lavorative
"
;
?>
8 record trovati
8 record visualizzati
nome start end DiffDate
Migliavacca Luigi 08-09-2011 10:00:00 08-09-2011 15:00:00 0
Rizzi Carlo 08-09-2011 8:00:00 08-09-2011 14:00:00 0
Liberali Franca 07-09-2011 22:40:00 08-09-2011 8:00:00 1
Di Maggio Mario 08-09-2011 13:59:00 08-09-2011 22:30:00 0
Scicchitano Andrea 13-10-2013 7:05:00 13-10-2013 14:15:00 0
Edelvisi Maurizio 13-10-2013 13:58:00 13-10-2013 21:05:00 0
Gerardini Silvano 13-10-2013 20:58:00 14-10-2013 7:05:00 1
Pasotti Alessio 14-10-2013 6:43:00 14-10-2013 14:11:00 0

La funzione TIMESTAMPDIFF() per calcolare gli anni

Per avere la differenza di tempo trascorso tra due date in anni occorre rivolgersi alla funzione TIMESTAMPDIFF() che accetta un terzo argomento che indica quale unità di misura deve essere usata nel mostrare il risultato restituito.

Mostra gli anni dei miei contatti

esempio 3
1
2
3
4
5
6
7
8
<?php
$Query 
"SELECT cognome, nome, 
DATE_FORMAT( data_nascita, '%d-%m-%Y' ) AS nato, 
TIMESTAMPDIFF(YEAR, data_nascita, CURDATE( )) AS eta
FROM sql_agenda
ORDER BY eta DESC
"
;
?>
103 record trovati
15 record visualizzati
cognome nome nato eta
pinco pallino 01-01-1934 88
Uberti Federico 12-01-1947 75
Forlini Andrea 24-12-1948 73
giulio cesare 10-04-1950 72
Vitulano Vincenzo 15-02-1951 71
Deiana Alberino 05-05-1951 71
Biancarosa Francesca 05-09-1956 65
Zuna Clotilde 15-08-1961 60
Costanza Antonietta 11-11-1966 55
Daniel Nicola 21-02-1977 45
Edelvisi Maurizio 02-07-1987 35
Querio Angela 30-04-1987 35
Poggi Giuseppe 25-01-1987 35
Ravizzola Stefano 16-04-1988 34
Di Bartolomeo Onorino 02-07-1988 34
... ... ... ...

La funzione TIMESTAMPDIFF() per calcolare gli anni, i mesi o i giorni

Nel prossimo esempio viene mostrato come calcolare la differenza in anni, mesi o giorni. Da non confondere col calcolo degli anni mesi è giorni di cui si parlerà in "Età - Compleanni".

Mostra gli anni, i medsi o i giorni dei miei contatti

esempio 3
1
2
3
4
5
6
7
8
9
10
<?php
$Query 
"SELECT cognome, nome, 
DATE_FORMAT( data_nascita, '%d-%m-%Y' ) AS nato, 
TIMESTAMPDIFF(YEAR, data_nascita, CURDATE( )) AS anni,
TIMESTAMPDIFF(MONTH, data_nascita, CURDATE( )) AS mesi,
TIMESTAMPDIFF(DAY, data_nascita, CURDATE( )) AS giorni
FROM sql_agenda
ORDER BY anni DESC
"
;
?>
103 record trovati
15 record visualizzati
cognome nome nato anni mesi giorni
pinco pallino 01-01-1934 88 1062 32326
Uberti Federico 12-01-1947 75 905 27567
Forlini Andrea 24-12-1948 73 882 26855
giulio cesare 10-04-1950 72 866 26383
Vitulano Vincenzo 15-02-1951 71 856 26072
Deiana Alberino 05-05-1951 71 853 25993
Biancarosa Francesca 05-09-1956 65 789 24043
Zuna Clotilde 15-08-1961 60 730 22238
Costanza Antonietta 11-11-1966 55 667 20324
Daniel Nicola 21-02-1977 45 544 16569
Edelvisi Maurizio 02-07-1987 35 420 12786
Querio Angela 30-04-1987 35 422 12849
Poggi Giuseppe 25-01-1987 35 425 12944
Ravizzola Stefano 16-04-1988 34 410 12497
Di Bartolomeo Onorino 02-07-1988 34 408 12420
... ... ... ... ... ...

La funzione TIMEDIFF()

In questo esempio viene utilizzata l'altra funzione simile alla funzione DATEDIFF() ed è la funzione TIMEDIFF() che, invece di restituire la differenza in giorni la restituisce in formato orario (hh:mm:ss). Per gli orari a cavallo della mezzanotte non ci sono problemi se il formato del campo è DATE o DATETIME.

Mostra il tempo trascorso tra due date in formato DATE-TIME comprese quelle a cavallo della mezzanotte

esempio 4
1
2
3
4
5
6
7
8
<?php
$Query 
"SELECT nome, 
DATE_FORMAT( data_start, '%d-%m-%Y %k:%i:%s' ) AS start, 
DATE_FORMAT( data_end, '%d-%m-%Y %k:%i:%s' ) AS end, 
TIMEDIFF( data_end , data_start ) AS DiffDate
FROM sql_ore_lavorative
"
;
?>
8 record trovati
8 record visualizzati
nome start end DiffDate
Migliavacca Luigi 08-09-2011 10:00:00 08-09-2011 15:00:00 05:00:00
Rizzi Carlo 08-09-2011 8:00:00 08-09-2011 14:00:00 06:00:00
Liberali Franca 07-09-2011 22:40:00 08-09-2011 8:00:00 09:20:00
Di Maggio Mario 08-09-2011 13:59:00 08-09-2011 22:30:00 08:31:00
Scicchitano Andrea 13-10-2013 7:05:00 13-10-2013 14:15:00 07:10:00
Edelvisi Maurizio 13-10-2013 13:58:00 13-10-2013 21:05:00 07:07:00
Gerardini Silvano 13-10-2013 20:58:00 14-10-2013 7:05:00 10:07:00
Pasotti Alessio 14-10-2013 6:43:00 14-10-2013 14:11:00 07:28:00

E' ovvio che usando la funzione TIMEDIFF() su valori di tipo DATE il risultato che si ottiene va da 00:00:00 se le date sono uguali o con incremento di 24 ore per date superiori come 24:00:00, ecc.

Mostra il tempo trascorso tra due date che hanno il solo formato DATE

esempio 5
1
2
3
4
5
6
7
8
<?php
$Query 
"SELECT nome, 
DATE_FORMAT( data_entra, '%d-%m-%Y' ) AS start,
DATE_FORMAT( data_esce, '%d-%m-%Y' ) AS end,
TIMEDIFF( data_esce, data_entra ) AS DiffDate
FROM sql_ore_lavorative
"
;
?>
8 record trovati
8 record visualizzati
nome start end DiffDate
Migliavacca Luigi 08-09-2011 08-09-2011 00:00:00
Rizzi Carlo 08-09-2011 08-09-2011 00:00:00
Liberali Franca 07-09-2011 08-09-2011 24:00:00
Di Maggio Mario 08-09-2011 08-09-2011 00:00:00
Scicchitano Andrea 13-10-2013 13-10-2013 00:00:00
Edelvisi Maurizio 13-10-2013 13-10-2013 00:00:00
Gerardini Silvano 13-10-2013 14-10-2013 24:00:00
Pasotti Alessio 14-10-2013 14-10-2013 00:00:00

Calcoli su orari a cavallo della mezzanotte con TIMEDIFF()

Se nell'esempio precedente (esempio 4) Il calcolo ha funzionato, in questo esempio sembra non funzionare.
Questo è dovuto al fatto che, mentre nel precedente esempio si eseguiva il calcolo su un campo composto da data - orario, nel seguente viene eseguito sul semplice orario, senza data.
Nel prossimo esempio si esegue 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".
Per risolvere il problema chiediamo aiuto ad altre due funzioni: la funzione TIME_TO_SEC() e la funzione SEC_TO_TIME() che vedremo più sotto e nella prossima pagina.

Mostra il tempo trascorso tra due orari, compresi quelli a cavallo della mezzanotte

esempio 6
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
esempio 6 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