Lavorare con frazioni temporali

Gli argomenti di questa pagina

  • Le funzioni DAY(), MONTH(), YEAR(), HOUR(), MINUTE(), SECOND()
  • Estrazione di frazioni temporali
  • Calcoli su campi temporali con frazioni temporali
  • Calcolare il giorno della settimana con DAYOFWEEK() e ELT()
  • Verificare una scadenza

Le funzioni DAY(), MONTH(), YEAR(), HOUR(), MINUTE(), SECOND()

come abbiamo visto in "Elenco funzioni Data Ora" ci sono alcune funzioni MYSQL utili per estrerre porzioni di dati temporali.
Le funzioni che vedremo in questa pagina sono: DAY(), MONTH(), YEAR(), HOUR(), MINUTE(), SECOND() che tra tutte le funzioni, forse sono le più utili.

Il loro utilizzo si può prestare a molteplici usi:

  • estrazione di frazioni temporali da un campo DATA o TIME o DATATIME
  • calcoli cu campi temporali
  • creazione di Query complesse.

Le tabelle in esame sono sql_lib_prestiti e sql_ore_lavorative con i record mostrati qui di seguito:

10 record letti
id id_libro id_iscritto data_prestito data_restituzione
1 2 5 2014-04-01 2014-04-15
2 8 21 2014-03-29 2014-04-09
3 20 12 2014-05-02 NULL
4 15 78 2014-02-13 NULL
5 2 34 2014-04-19 NULL
6 5 11 2014-01-20 NULL
7 5 36 2013-03-15 2013-04-19
8 10 52 2013-02-02 NULL
9 9 41 2012-01-01 2013-04-10
10 21 34 2014-03-10 2014-04-09
8 record letti
id nome data_entra data_esce data_start data_end
1 Migliavacca Luigi 2011-09-08 2011-09-08 2011-09-08 10:00:00 2011-09-08 15:00:00
2 Rizzi Carlo 2011-09-08 2011-09-08 2011-09-08 08:00:00 2011-09-08 14:00:00
3 Liberali Franca 2011-09-07 2011-09-08 2011-09-07 22:40:00 2011-09-08 08:00:00
4 Di Maggio Mario 2011-09-08 2011-09-08 2011-09-08 13:59:00 2011-09-08 22:30:00
5 Scicchitano Andrea 2013-10-13 2013-10-13 2013-10-13 07:05:00 2013-10-13 14:15:00
6 Edelvisi Maurizio 2013-10-13 2013-10-13 2013-10-13 13:58:00 2013-10-13 21:05:00
7 Gerardini Silvano 2013-10-13 2013-10-14 2013-10-13 20:58:00 2013-10-14 07:05:00
8 Pasotti Alessio 2013-10-14 2013-10-14 2013-10-14 06:43:00 2013-10-14 14:11:00

Estrazione di frazioni temporali

Mostra il giorno, il mese e l'anno dei prestiti

1
2
3
4
5
6
7
8
9
<?php
$Query 
"SELECT 
    DATE_FORMAT( data_prestito, '%d-%m-%Y' ) AS data_orig, 
    DAY( data_prestito ) AS giorno, 
    MONTH( data_prestito ) AS mese, 
    YEAR( data_prestito ) AS anno
FROM sql_lib_prestiti
"
;
?>
10 record letti
data_orig giorno mese anno
01-04-2014 1 4 2014
29-03-2014 29 3 2014
02-05-2014 2 5 2014
13-02-2014 13 2 2014
19-04-2014 19 4 2014
20-01-2014 20 1 2014
15-03-2013 15 3 2013
02-02-2013 2 2 2013
01-01-2012 1 1 2012
10-03-2014 10 3 2014

Mostra il giorno, il mese e l'anno delle restituzioni

1
2
3
4
5
6
7
8
9
10
<?php
$Query 
"SELECT 
    DATE_FORMAT( data_restituzione, '%d-%m-%Y' ) AS data_orig, 
    DAY( data_restituzione ) AS giorno, 
    MONTH( data_restituzione ) AS mese, 
    YEAR( data_restituzione ) AS anno
FROM sql_lib_prestiti
WHERE data_restituzione IS NOT NULL
"
;
?>
5 record letti
data_orig giorno mese anno
15-04-2014 15 4 2014
09-04-2014 9 4 2014
19-04-2013 19 4 2013
10-04-2013 10 4 2013
09-04-2014 9 4 2014

Mostra le ore, minuti e secondi della data ora ingresso

1
2
3
4
5
6
7
8
9
<?php
$Query 
"SELECT nome,
DATE_FORMAT( data_start, '%d-%m-%Y %k:%i:%s' ) AS data_orig, 
HOUR( data_start ) AS ore, 
MINUTE( data_start ) AS minuti, 
SECOND( data_start ) AS secondi 
FROM sql_ore_lavorative
"
;
?>
8 record letti
nome data_orig ore minuti secondi
Migliavacca Luigi 08-09-2011 10:00:00 10 0 0
Rizzi Carlo 08-09-2011 8:00:00 8 0 0
Liberali Franca 07-09-2011 22:40:00 22 40 0
Di Maggio Mario 08-09-2011 13:59:00 13 59 0
Scicchitano Andrea 13-10-2013 7:05:00 7 5 0
Edelvisi Maurizio 13-10-2013 13:58:00 13 58 0
Gerardini Silvano 13-10-2013 20:58:00 20 58 0
Pasotti Alessio 14-10-2013 6:43:00 6 43 0

Calcoli su campi temporali con frazioni temporali

Aggiungi giorni, mesi o anni alla data in esame

1
2
3
4
5
6
7
8
9
<?php
$Query 
"SELECT  
    DATE_FORMAT( data_prestito, '%d-%m-%Y' ) AS data_orig, 
    DATE_FORMAT( DATE_ADD(data_prestito,INTERVAL 90 DAY), '%d-%m-%Y' ) AS day_add, 
    DATE_FORMAT( DATE_ADD(data_prestito,INTERVAL 4 MONTH), '%d-%m-%Y' ) AS mont_add, 
    DATE_FORMAT( DATE_ADD(data_prestito,INTERVAL 4 YEAR), '%d-%m-%Y' ) AS year_add 
FROM sql_lib_prestiti 
"
;
?>
10 record letti
data_orig day_add mont_add year_add
01-04-2014 30-06-2014 01-08-2014 01-04-2018
29-03-2014 27-06-2014 29-07-2014 29-03-2018
02-05-2014 31-07-2014 02-09-2014 02-05-2018
13-02-2014 14-05-2014 13-06-2014 13-02-2018
19-04-2014 18-07-2014 19-08-2014 19-04-2018
20-01-2014 20-04-2014 20-05-2014 20-01-2018
15-03-2013 13-06-2013 15-07-2013 15-03-2017
02-02-2013 03-05-2013 02-06-2013 02-02-2017
01-01-2012 31-03-2012 01-05-2012 01-01-2016
10-03-2014 08-06-2014 10-07-2014 10-03-2018

Calcolare il giorno della settimana con DAYOFWEEK() e ELT()

Nei due esempi che seguono faccio uso di due funzioni:

  • DAYOFWEEK che restituisce il numero della settimanda della data in esame
  • ELT che restituisce una stringa indicata da un numero

La funzione MYSQL ELT() restituisce la stringa che, nella lista degli argomenti stringa (assimilabile ad un ARRAY), occupa la posizione indicata da un numero.
Il numero indicato come primo argomento della funzione infatti è un indice che serve per prelevare la stringa che occupa la posizione indicata dal numero.
La sintassi per la funzione MYSQL ELT():

ELT(N,Str1, Str2, Str3,...);

Dall'associazione delle due funzioni:

  • con DAYOFWEEK() viene estratto il numero relativo al giorno della data indicata
  • con ELT() viene prelevato il numero fornito da DAYOFWEEK() che serve ad estrarre una stringa dall'elenco di stringhe fornite per ottenere il giorno della settimana in italiano

Mostra in che giorno della settimanda cade una data

1
2
3
4
5
6
7
8
<?php
$Query1 
"SELECT DATE_FORMAT( CURDATE(), '%d-%m-%Y' ) AS data_odierna ,
DAYOFWEEK(CURDATE()) AS Giorno
"
;
$Query2 "SELECT DATE_FORMAT( CURDATE(), '%d-%m-%Y' ) AS data_odierna ,
ELT(DAYOFWEEK(CURDATE()),'dom','lun','mar','mer','gio','ven','sab') AS Giorno
"
;
?>
1 record letti
data_odierna Giorno
04-07-2022 2
1 record letti
data_odierna Giorno
04-07-2022 lun

Mostra in che giorno della settimana sono nati i miei contatti

1
2
3
4
5
6
7
<?php
//    data_nascita    sql_agenda
$Query "SELECT DATE_FORMAT( data_nascita, '%d-%m-%Y' ) AS data_nascita,
ELT(DAYOFWEEK(data_nascita),'dom','lun','mar','mer','gio','ven','sab') AS Giorno
FROM sql_agenda 
"
;
?>
103 record trovati
15 record visualizzati
data_nascita Giorno
22-01-2004 gio
22-11-2007 gio
20-08-2004 ven
21-05-2009 gio
12-01-1997 dom
02-07-1987 gio
12-08-2009 mer
14-11-1987 sab
26-07-1987 dom
25-01-1987 dom
26-06-1988 dom
19-07-1987 dom
10-05-2009 dom
08-08-1999 dom
20-03-2002 mer
... ...

Verificare una scadenza

controlla i libri prestati da più di 90 giorni ed ancora non restituiti

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$Query 
"SELECT sql_lib_prestiti.id, 
    sql_agenda.cognome, 
    sql_agenda.nome, 
    sql_libri.Titolo, 
    DATE_FORMAT( sql_lib_prestiti.data_prestito, '%d-%m-%Y' ) AS Prestato , 
    DATE_FORMAT( DATE_ADD( sql_lib_prestiti.data_prestito, INTERVAL 90 DAY ), '%d-%m-%Y' ) AS scadenza, 
    DATE_FORMAT( CURDATE( ), '%d-%m-%Y' ) AS oggi
FROM sql_lib_prestiti 
    INNER JOIN sql_libri 
        ON sql_libri.id = sql_lib_prestiti.id_libro 
    INNER JOIN sql_agenda 
        ON sql_agenda.id = sql_lib_prestiti.id_iscritto
WHERE sql_lib_prestiti.data_restituzione IS NULL
AND DATE_ADD( sql_lib_prestiti.data_prestito, INTERVAL 90
DAY ) < CURDATE( )
"
;
?>
5 record letti
id cognome nome Titolo Prestato scadenza oggi
3 Borsotti Mirella Poser 4 Pro 02-05-2014 31-07-2014 04-07-2022
4 Alama Ornella CorelDRAW 13-02-2014 14-05-2014 04-07-2022
5 Basilio Davide Macromedia Flash 6 19-04-2014 18-07-2014 04-07-2022
6 Curti Oreste Adobe Photoshop 7.0 20-01-2014 20-04-2014 04-07-2022
8 Alcantara Pinuccia Adobe Digital Video Collection 02-02-2013 03-05-2013 04-07-2022

controlla i libri prestati, non restituiti ma ancora non scaduti

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$Query 
"SELECT sql_lib_prestiti.id, 
    sql_agenda.cognome, 
    sql_agenda.nome, 
    sql_libri.Titolo, 
    DATE_FORMAT( sql_lib_prestiti.data_prestito, '%d-%m-%Y' ) AS Prestato , 
    DATE_FORMAT( DATE_ADD( sql_lib_prestiti.data_prestito, INTERVAL 90 DAY ), '%d-%m-%Y' ) AS scadenza, 
    DATE_FORMAT( CURDATE( ), '%d-%m-%Y' ) AS oggi
FROM sql_lib_prestiti 
    INNER JOIN sql_libri 
        ON sql_libri.id = sql_lib_prestiti.id_libro 
    INNER JOIN sql_agenda 
        ON sql_agenda.id = sql_lib_prestiti.id_iscritto
WHERE sql_lib_prestiti.data_restituzione IS NULL
AND DATE_ADD( sql_lib_prestiti.data_prestito, INTERVAL 90
DAY ) >= CURDATE( )
"
;
?>
Nessun record restituito

 

 



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