Funzioni DATE_ADD() e DATE_SUB()

Gli argomenti di questa pagina

  • Definizione e sintassi delle funzioni DATE_ADD() e DATE_SUB()
  • Elenco degli argomenti utilizzabili con le funzioni DATE_ADD() e DATE_SUB()
  • Seguono alcuni esempi di utilizzo di queste due funzioni
  • Riepilogo

Definizione e sintassi delle funzioni DATE_ADD() e DATE_SUB()

La funzione DATE_ADD(), sinonimo della funzione ADDDATE(), aggiunge uno specificato intervallo di tempo ad una data, mentre la funzione DATE_SUB(), sinonimo della funzione SUBDATE(), toglie uno specificato intervallo di tempo ad una data. Queste funzioni eseguono dei calcoli aritmetici sulle date.
Generalmente queste funzioni vengono invocate con la parola chiave INTERVAL. La parola chiave INTERVAL e l'unità identificatore non sono case sensitive.
La sintassi è semplice:

DATE_ADD(date,INTERVAL expr tipo)
DATE_SUB(date,INTERVAL expr tipo)

Il primo argomento data specifica una data o un qualsiasi valore datetime di partenza.
INTERVAL è una parola chiave che precede ed indica le unità su cui operare il calcolo
expr è un numero di un intervallo che si vuole aggiungere o sottraare
Il tipo da dare come INTERVAL è elencato qui di seguito.

Elenco degli argomenti utilizzabili con le funzioni DATE_ADD() e DATE_SUB()

# Unità di tempo Formato atteso
1 MICROSECOND  MICROSECONDI
2 SECOND  SECONDI
3 MINUTE  MINUTI
4 HOUR  ORE
5 DAY  GIORNI
6 WEEK  SETTIMANE
7 MONTH  MESI
8 QUARTER  TRIMESTRI
9 YEAR  ANNI
10 SECOND_MICROSECOND  SECONDI MICROSECONDI
11 MINUTE_MICROSECOND  MINUTI MICROSECONDI
12 MINUTE_SECOND  MINUTI SECONDI
13 HOUR_MICROSECOND  ORE MICROSECONDI
14 HOUR_SECOND  ORE: MINUTI: SECONDI
15 HOUR_MINUTE  ORE: MINUTI
16 DAY_MICROSECOND  GIORNI.MICROSECONDI
17 DAY_SECOND  GIORNI ORE: MINUTI: SECONDI
18 DAY_MINUTE  GIORNI ORE: MINUTI
19 DAY_HOUR  ORE GIORNI
20 YEAR_MONTH  ANNI-MESI

Seguono alcuni esempi di utilizzo di queste due funzioni

In questo ed in altri esempi di questo genere la funzione DATE_ADD() è nidificata nell'altra funzione DATE_FORMAT() per ottenerne il risultato nel formato gg-mm-aaaa.
Se non si adottasse questo sistema di nidificazione e si volesse usare la sola funzione DATE_ADD() otterremo la data nel formato con cui è memorizzata nel DB, ossia aaaa-mm-gg.

In questo esempio vengono aggiunti 10 giorni alla data letta nel DB

esempio 1
1
2
3
4
5
6
7
<?php
$Query 
"SELECT cognome, nome, 
DATE_FORMAT( data_nascita, '%d-%m-%Y' ) AS nato, 
DATE_FORMAT(DATE_ADD(data_nascita,INTERVAL 10 DAY), '%d-%m-%Y' ) AS FutureDate 
FROM sql_rubrica
"
;
?>
101 record trovati
15 record visualizzati
cognome nome nato FutureDate
Migliavacca Luigi 22-01-2004 01-02-2004
Rizzi Carlo 22-11-2007 02-12-2007
Liberali Franca 20-02-2004 01-03-2004
Di Maggio Mario 21-05-2009 31-05-2009
Scicchitano Andrea 12-01-1997 22-01-1997
Edelvisi Maurizio 02-07-1987 12-07-1987
Gerardini Silvano 12-08-2009 22-08-2009
Pasotti Alessio 14-11-1987 24-11-1987
Calvi Giovanni 26-07-1987 05-08-1987
Poggi Giuseppe 25-01-1987 04-02-1987
Curti Oreste 26-06-1988 06-07-1988
Borsotti Mirella 19-07-1987 29-07-1987
Franchinotti Anna 10-05-2009 20-05-2009
Pischedda Giovanni 08-08-1999 18-08-1999
Maini Marilena 20-03-2002 30-03-2002
... ... ... ...

Questo esempio è l'inverso di quello appena visto: alla data letta vengono tolti 10 giorni

esempio 2
1
2
3
4
5
6
7
<?php
$Query 
"SELECT cognome, nome, 
DATE_FORMAT( data_nascita, '%d-%m-%Y' ) AS nato, 
DATE_FORMAT(DATE_SUB(data_nascita,INTERVAL 10 DAY), '%d-%m-%Y' ) AS EarlierDate 
FROM sql_rubrica
"
;
?>
101 record trovati
15 record visualizzati
cognome nome nato EarlierDate
Migliavacca Luigi 22-01-2004 12-01-2004
Rizzi Carlo 22-11-2007 12-11-2007
Liberali Franca 20-02-2004 10-02-2004
Di Maggio Mario 21-05-2009 11-05-2009
Scicchitano Andrea 12-01-1997 02-01-1997
Edelvisi Maurizio 02-07-1987 22-06-1987
Gerardini Silvano 12-08-2009 02-08-2009
Pasotti Alessio 14-11-1987 04-11-1987
Calvi Giovanni 26-07-1987 16-07-1987
Poggi Giuseppe 25-01-1987 15-01-1987
Curti Oreste 26-06-1988 16-06-1988
Borsotti Mirella 19-07-1987 09-07-1987
Franchinotti Anna 10-05-2009 30-04-2009
Pischedda Giovanni 08-08-1999 29-07-1999
Maini Marilena 20-03-2002 10-03-2002
... ... ... ...

In questo terzo esempio uso entrambe le funzioni: DATE_SUB e DATE_ADD ed agisco sui mesi anzichè sui giorni.

esempio 3
1
2
3
4
5
6
7
8
<?php
$Query 
"SELECT cognome, nome, 
DATE_FORMAT( data_nascita, '%d-%m-%Y' ) AS nato, 
DATE_FORMAT(DATE_SUB(data_nascita,INTERVAL 1 MONTH), '%d-%m-%Y' ) AS EarlierDate, 
DATE_FORMAT(DATE_ADD(data_nascita,INTERVAL 1 MONTH), '%d-%m-%Y' ) AS FutureDate 
FROM sql_rubrica
"
;
?>
101 record trovati
15 record visualizzati
cognome nome nato EarlierDate FutureDate
Migliavacca Luigi 22-01-2004 22-12-2003 22-02-2004
Rizzi Carlo 22-11-2007 22-10-2007 22-12-2007
Liberali Franca 20-02-2004 20-01-2004 20-03-2004
Di Maggio Mario 21-05-2009 21-04-2009 21-06-2009
Scicchitano Andrea 12-01-1997 12-12-1996 12-02-1997
Edelvisi Maurizio 02-07-1987 02-06-1987 02-08-1987
Gerardini Silvano 12-08-2009 12-07-2009 12-09-2009
Pasotti Alessio 14-11-1987 14-10-1987 14-12-1987
Calvi Giovanni 26-07-1987 26-06-1987 26-08-1987
Poggi Giuseppe 25-01-1987 25-12-1986 25-02-1987
Curti Oreste 26-06-1988 26-05-1988 26-07-1988
Borsotti Mirella 19-07-1987 19-06-1987 19-08-1987
Franchinotti Anna 10-05-2009 10-04-2009 10-06-2009
Pischedda Giovanni 08-08-1999 08-07-1999 08-09-1999
Maini Marilena 20-03-2002 20-02-2002 20-04-2002
... ... ... ... ...

Ed ora vediamo come aggiungere le ore

esempio 4
1
2
3
4
5
6
7
<?php
$Query 
"SELECT nome, 
DATE_FORMAT( data_start, '%d-%m-%Y %k:%i:%s' ) AS data_in_esame, 
DATE_FORMAT(DATE_ADD(data_start,INTERVAL 10 HOUR), '%d-%m-%Y %k:%i:%s' ) AS futureDate 
FROM sql_ore_lavorative
"
;
?>
8 record trovati
8 record visualizzati
nome data_in_esame futureDate
Migliavacca Luigi 08-09-2011 10:00:00 08-09-2011 20:00:00
Rizzi Carlo 08-09-2011 8:00:00 08-09-2011 18:00:00
Liberali Franca 07-09-2011 22:40:00 08-09-2011 8:40:00
Di Maggio Mario 08-09-2011 13:59:00 08-09-2011 23:59:00
Scicchitano Andrea 13-10-2013 7:05:00 13-10-2013 17:05:00
Edelvisi Maurizio 13-10-2013 13:58:00 13-10-2013 23:58:00
Gerardini Silvano 13-10-2013 20:58:00 14-10-2013 6:58:00
Pasotti Alessio 14-10-2013 6:43:00 14-10-2013 16:43:00

Riepilogo

Ora nella tabella sottostante una carrellata di esempi sulle due (quattro comprese le funzioni equivalenti) funzioni MYSQL DATE_SUB e DATE_ADD.
Quando vediamo nella colonna dei risultati "Problema con Query", salvo reali errori nella Query stessa (qui esclusi perchè pazientemente testati), osservando la data indicata nella Query, noteremo che la stessa non è corretta: 2006-07-00, 2005-03-32.
Il messaggio di errore inserito sostituisce l'eventuale valore NULL restituito dalla Query.

Una serie di Query veloci

1 SELECT DATE_ADD(curdate(), INTERVAL 1 HOUR) AS data 2022-05-29 01:00:00
2 SELECT DATE_ADD(curdate(), INTERVAL 1 DAY) AS data 2022-05-30
3 SELECT DATE_ADD(curdate(), INTERVAL '1.1' YEAR_MONTH) AS data 2023-06-29
4 SELECT DATE_ADD('1997-12-31 23:59:59', INTERVAL 1 DAY) AS data 1998-01-01 23:59:59
5 SELECT DATE_ADD('1997-02-28 23:59:59', INTERVAL 8 DAY) AS data 1997-03-08 23:59:59
6 SELECT DATE_ADD('1997-12-31 23:59:59', INTERVAL 1 MINUTE) AS data 1998-01-01 00:00:59
7 SELECT DATE_ADD('2005-07-19 08:40:10', INTERVAL '1:5' HOUR_MINUTE) AS data 2005-07-19 09:45:10
8 SELECT DATE_ADD('2006-07-01', INTERVAL 1 DAY) AS DATA 2006-07-02
9 SELECT ADDDATE('2006-07-01', INTERVAL 1 DAY) AS DATA 2006-07-02
10 SELECT DATE_ADD('1999-01-01', INTERVAL 1 HOUR) AS DATA 1999-01-01 01:00:00
11 SELECT DATE_ADD('2006-07-00', INTERVAL 1 DAY) AS DATA Problema con Query
12 SELECT '2005-03-32' + INTERVAL 1 DAY AS data Problema con Query
13 SELECT '2005-07-19' + INTERVAL 1 DAY AS data 2005-07-20
14 SELECT DATE_SUB(curdate(), INTERVAL 1 HOUR) AS data 2022-05-28 23:00:00
15 SELECT DATE_SUB(curdate(), INTERVAL 1 DAY) AS data 2022-05-28
16 SELECT DATE_SUB(curdate(), INTERVAL 1 WEEK) AS data 2022-05-22
17 SELECT DATE_SUB(curdate(), INTERVAL 1 MONTH) AS data 2022-04-29
18 SELECT DATE_SUB(curdate(), INTERVAL '1.1' YEAR_MONTH) AS data 2021-04-29
19 SELECT DATE_SUB('1997-12-31 00:00:00', INTERVAL 1 MINUTE) AS data 1997-12-30 23:59:00
20 SELECT DATE_SUB(curdate(),interval 67 year) AS data 1955-05-29
21 SELECT DATE_SUB('2005-07-19 10:50:10', INTERVAL '1:5' HOUR_MINUTE) AS data 2005-07-19 09:45:10

 

 



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